这是对 dan (dan^spotify on IRC) 提议查看我的测试用例的回应,但我将其发布在这里,以防有人遇到类似问题。
我遇到了 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 上进行了测试。尽管连续多次运行该应用程序,但他没有报告任何崩溃。