libspotify:注销或释放会话会导致崩溃

时间:2013-01-09 20:55:29

标签: spotify

这是为了回应dan(在IRC上发布的^ ^ spotify)提供看看我的测试用例,但我在这里发布以防万一有人遇到类似的问题。

我遇到了libspotify的问题,在这两种情况下,应用程序崩溃(内存访问冲突):

  • 调用sp_session_logout()函数后调用的第一个sp_session_process_events(由通知主线程回调触发)崩溃应用程序
  • 跳过注销并调用sp_session_release()会使应用程序崩溃

我已经从会话回调中应用了足够的同步,而我正在单个线程上运行。

我做了一个小测试用例,它执行以下操作:

  • 创建会话
  • 登录
  • 等待10秒
  • 尝试注销,崩溃时(调用sp_session_process_events()时)
  • 如果它成功注销(它不是),会调用sp_session_release()

我为测试用例做了一个要点。可在此处找到:https://gist.github.com/4496396

测试用例是使用Qt(我正在为我的项目使用),所以你需要Qt 5来编译它。我也只是用Windows和Linux编写它(没有Mac)。假设您安装了Qt 5和Qt Creator,说明如下:

  • 下载要点
  • 将libspotify文件夹复制到与.pro文件相同的文件夹
  • 将appkey.c文件复制到同一文件夹
  • 使用您的用户名和密码编辑main.cpp以登录
  • 在sessiontest.cpp中编辑第38-39行,并根据您的喜好设置缓存和设置路径
  • 打开.pro文件并从Qt Creator
  • 运行

如果有人能告诉我自己做错了什么,我会非常感激,因为我花了这么多时间尝试任何我能想到的事情,或者只是盯着它,我担心自己已​​经失明了我现在的错误。

我在Windows 7和Linux Ubuntu 12.10上都测试了它,我发现行为有所不同:

  • 在Windows上,无论设置和缓存路径如何,测试用例都会崩溃。
  • 在Linux上,如果将设置和缓存设置为“”(空字符串),则注销和释放会话可以正常工作。
  • 在Linux上,如果路径是其他任何东西,第一次运行(当文件夹尚不存在时)会按原样退出并释放会话,但在下次运行时(当文件夹已存在时),它会完全崩溃就像在Windows上一样。

另外,我可以报告sp_session_flush_caches()导致崩溃。

编辑:另外,IRC上的hugo___非常友好,可以在OSX上测试它。尽管连续多次运行该应用程序,但他没有报告崩溃。

4 个答案:

答案 0 :(得分:1)

虽然你很可能正在查看libspotify中的一个错误,但我想指出对sp_session_process_events()的一个可能多余的调用,这是从我查看你的代码时收集到的。

void SessionTest::processSpotifyEvents()
{
  if (m_session == 0)
  {
    qDebug() << "Process: No session.";
    return;
  }
  int interval = 0;
  sp_session_process_events(m_session, &interval);
  qDebug() << interval;
  m_timerId = startTimer(interval);
}

似乎此代码将获取interval值并在其上启动计时器以触发对event()的后续调用。但是,当interval为0时,此代码也将调用startTimer,这绝对不是必需的,或者更确切地说意味着应用程序可以继续执行其他操作,直到获得notify_main_thread回调。 startTimer上的文档说“如果interval为0,那么每当没有更多的窗口系统事件要处理时,定时器事件就会发生一次。”我不确定这究竟意味着什么,但似乎它可以产生至少一个sp_session_process_events()的冗余调用。

http://qt-project.org/doc/qt-4.8/qobject.html#startTimer

答案 1 :(得分:1)

我注意到,如果您在调用时播放曲目,则会在sp_session_release上崩溃。

答案 2 :(得分:0)

我今天一直在追逐这个问题。登录/注销在Mac上运行正常,但问题是100%可重复的,如您在Windows上所述。

通过注册offline_status_updatedcredentials_blob_updated的空回调,崩溃就消失了。这是一个非常令人不满意的解决方案,我想知道是否有任何 libspotify 开发人员想对它发表评论。

我的应用中注册的回调是:

  • logged_in
  • logged_out
  • notify_main_thread
  • log_message
  • offline_status_updated
  • credentials_blob_updated

我应该明确指出我在你提供的代码上做了尝试这个。知道添加这两个额外的回调是否适合您将会很有趣。请注意,我提供的功能绝对没有。他们只需要在那里并在创建会话时进行注册。

答案 3 :(得分:0)

在&#34;登录&#34;中添加以下呼叫libspotify回调似乎可以修复此崩溃as detailed in this SO post

sp_session_playlistcontainer(session);