これは、私のテストケースを調べるというdan(IRCのdan ^ spotify)の申し出に応えたものですが、誰かが同様の問題に遭遇した場合に備えて、ここに投稿します。
次の2つのシナリオの両方で、アプリケーションがクラッシュする(メモリアクセス違反)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(私のプロジェクトで使用しているもの)を使用して作成されているため、コンパイルするにはQt5が必要です。また、WindowsとLinuxのみを念頭に置いて作成しました(Macは使用していません)。Qt5とQtCreatorがインストールされていると仮定すると、手順は次のとおりです。
- 要旨をダウンロード
- libspotifyフォルダーを.proファイルと同じフォルダーにコピーします
- appkey.cファイルを同じフォルダーにコピーします
- main.cppを編集して、ユーザー名とパスワードでログインします
- sessiontest.cppの38〜39行目を編集し、キャッシュと設定のパスを好みに合わせて設定します
- .proファイルを開き、QtCreatorから実行します
私は自分の考えていることを何でも試したり、見つめたりするのに何時間も費やしてきたので、誰かが私が間違っていることを教えてくれたらとてもありがたいです。今では。
Windows7とLinuxUbuntu12.10の両方でテストしましたが、動作にいくつかの違いがあります。
- Windowsでは、設定やキャッシュパスに関係なく、テストケースは常にクラッシュします。
- Linuxでは、設定とキャッシュを ""(空の文字列)に設定すると、ログアウトしてセッションを解放できます。
- Linuxでは、パスがそれ以外の場合、最初の実行(フォルダーがまだ存在しない場合)はログアウトしてセッションを解放しますが、次の実行(フォルダーが既に存在する場合)では、まったく同じ方法でクラッシュします。 Windowsで行います。
また、sp_session_flush_caches()がクラッシュを引き起こさないことを報告できます。
編集:また、IRCのhugo___は親切にもOSXでテストしてくれました。彼は、アプリケーションを連続して数回実行したにもかかわらず、クラッシュは発生しなかったと報告しました。