Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
libspotify:注销或释放会话导致崩溃_Spotify - Fatal编程技术网

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

libspotify:注销或释放会话导致崩溃,spotify,Spotify,这是对dan(dan^spotify on IRC)提出查看我的测试用例的回应,但我将其发布在这里,以防有人遇到类似问题 我在libspotify中遇到了一个问题,在这两种情况下,应用程序都会崩溃(内存访问冲突): 调用sp_session_logout()函数后调用的第一个sp_session_process_事件(由notify main thread回调触发)使应用程序崩溃 跳过注销并调用sp_session_release()会使应用程序崩溃 我已经从会话回调中应用了足够的同步,否则

这是对dan(dan^spotify on IRC)提出查看我的测试用例的回应,但我将其发布在这里,以防有人遇到类似问题

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

  • 调用sp_session_logout()函数后调用的第一个sp_session_process_事件(由notify main thread回调触发)使应用程序崩溃
  • 跳过注销并调用sp_session_release()会使应用程序崩溃
我已经从会话回调中应用了足够的同步,否则我将在单个线程上操作

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

  • 创建会话
  • 登录
  • 等待10秒
  • 尝试注销,在注销时崩溃(调用sp_session_process_events()时)
  • 如果成功注销(事实并非如此),将调用sp_session_release()
我为测试用例做了一个要点。可以在这里找到:

测试用例是使用Qt(这是我在项目中使用的),因此您需要qt5来编译它。我写这本书时也只考虑了Windows和Linux(没有Mac)。假设已安装Qt 5和Qt Creator,说明如下:

  • 下载要点
  • 将libspotify文件夹复制到与.pro文件相同的文件夹中
  • 将appkey.c文件复制到同一文件夹中
  • 编辑main.cpp以使用用户名和密码登录
  • 编辑sessiontest.cpp中的第38-39行,并根据您的喜好设置缓存和设置路径
  • 打开.pro文件并从Qt Creator运行
如果有人能告诉我我做错了什么,我会非常感激,因为我花了这么多时间尝试任何我能想到的事情,或者只是盯着它看,我担心我现在已经对自己的错误视而不见了

我已经在Windows 7和Linux Ubuntu12.10上对其进行了测试,发现了一些行为上的差异:

  • 在Windows上,无论设置和缓存路径如何,测试用例总是崩溃
  • 在Linux上,如果将设置和缓存设置为“”(空字符串),则注销并释放会话可以正常工作
  • 在Linux上,如果路径是其他路径,则第一次运行(当文件夹不存在时)将注销并按其应该的方式释放会话,但在下一次运行(当文件夹已存在时),它将以与Windows上完全相同的方式崩溃
另外,我可以报告sp_session_flush_caches()不会导致崩溃


编辑:另外,IRC上的hugo_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。尽管连续几次运行该应用程序,但他没有报告任何崩溃。

虽然您可能正在查看libspotify中的一个bug,但我想指出一个对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);
}
void SessionTest::processSpotifyEvents()
{
如果(m_会话==0)
{

qDebug()我注意到,如果在调用sp_session_版本时播放曲目,则会导致该版本崩溃。

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

通过为
offline\u status\u updated
credentials\u blob\u updated
注册空回调,崩溃消失了。这是一个非常不令人满意的修复方案,我想知道是否有libspotify开发者想对此发表评论

在我的应用程序中注册的回调包括:

  • 已登录\u
  • 注销
  • 通知主线程
  • log\u消息
  • offline\u status\u updated
  • 凭证\u blob\u更新

我应该明确地指出,我没有在您提供的代码上尝试这一点。我想知道添加这两个额外回调是否对您有效。请注意,我提供的函数完全没有任何作用。它们只需存在,并且在您创建会话时注册即可。

在“登录”中添加以下调用libspotify回调似乎修复了此崩溃:


sp\u session\u playlicanner(session);

你完全正确。事实上,我在发布后注意到了这一点,尽管将其更改为do{sp\u session\u process\u events(m\u session,&interval)}当interval==0时,它的行为似乎与此完全相同。这与我不记得在运行此测试用例时看到interval为0这一事实是一致的(已打印)。当然,你是对的,这是我的一个错误,尽管不幸的是,这似乎不是原因。。