2006年05月03日

Heimdallrのバグ解析

このサイトで公開しているRSSリーダー Heimdallr ですが、既知のバグが1件あります。最新の情報に更新する処理が永遠に終わらなくなるバグです。CPU使用率が100%になるのが特徴です。

発生頻度が低く、OSはWinXP Home、登録サイト数は200、更新間隔は30分という条件で、一週間に一度発生するかしないかくらいの頻度です。
おかげでバグ解析が難航しています。まだ原因は分かっていません。

原因は分かっていませんが、なんとなくMFCのCInternetSession、CHttpConnection、CHttpFileあたりの使い方が悪いのではないかと考えています。

HeimdallrではこれらのクラスをRSS Feedを取得するために使っており、その中で受信タイムアウトを実現するために以下の処理を行っています。

  1. CInternetSession::GetHttpConnectionを使用してCHttpConnectionオブジェクト取得。
  2. CHttpConnection::OpenRequestを用いてCHttpFileオブジェクト取得。
  3. タイムアウト用スレッド起動。
  4. CHttpFileオブジェクトを用いてリクエスト送信及びレスポンス受信。
  5. タイムアウトスレッド起動後、一定時間経過しても受信が完了しない場合は、タイムアウトスレッドからCHttpFile::Abortを呼び出す。

最後のAbort呼び出しを別スレッドから行っているのが問題で、このような使い方をした場合、正しく動作することが保障されるとはどこにも明記されていないのです。よって、何か問題が発生する可能性もあります。でも再現性が低いため本当にこれが原因なのか確認できていないのです。さてはて・・・。

投稿者 MASATO : 2006年05月03日 19:54 | トラックバック
コメント

CHttpFile::Abortが内部で呼んでいるInternetCloseHandleはスレッドセーフであることがドキュメントに明記されていました。後はCHttpFile自身がスレッドセーフであれば良いと思い、inet.cppを眺めていたところ、CHttpFileスレッドセーフではないものの、今のHeimdallrの使い方ではギリギリ問題がない気配・・・。もしかしてこの記事に書いてあることは全て私の勘違いかもしれません。

Posted by: MASATO : 2006年05月06日 19:55

レスポンスを返さないHTTPサーバーについてはテスト済なので問題はないと思います。
一番怪しいのがレスポンスボディ取得中のAbortではないかとみています。十分にテストされていませんし、複雑なので。

Posted by: MASATO : 2006年05月04日 01:18

レスポンスを返さないHTTPサーバーを用意して
タイムアウトスレッドからCHttpFile::Abortを呼び出すのを連打してみるとかではダメですかね?

Posted by: 瞳子 : 2006年05月03日 23:14
コメントする









名前、アドレスを登録しますか?