2009年3月14日土曜日

マルチスレッドについて(6)

 よくある事ですが、DEBUG情報を埋め込んで実行すると、マルチスレッドにおけるバグが再現しない事があります。一番簡単なのは、std::cout 等でデバッグ情報を出力する事ですが、これでは再現しないという事もあります。とにかく、手がかりが無い事には、どうしようもありません。Windows で私が使う手のうちのひとつに、OutputDebugString API を利用して、Release版でデバッグを行うというものがあります。あるいは、syslog に出力するというのも良いと思います。マルチスレッドのバグ再現はタイミング命なので、メッセージは短く必要最小限にとどめましょう。
 どこで、それが起こっているか?が問題で、ソースコードの一部をコメントアウトするなどして、問題が起きる場合の組み合わせを把握するようにしましょう。とにかくマルチスレッド絡みのデバッグは心身ともにタフでなければ、やっていけません。問題箇所を絞り込むという作業が大切です。
 問題箇所を絞り込む事ができたら9割方は解決したようなものです。と言っても破綻しないモデルを考えなければならない場合もありますが…。ここからは、想像力が必要となります。コンテキスト・スイッチが、ここで起こったら?を想像します。アセンブラに近いレベルで考えないといけません。よって、高級言語だけでやってきた人には、しんどい作業かもしれません。
 リーダ・ライタ・ロックのデバッグ用に作った、LockTestのプログラムと解説って、いるかな?この話題書くの、ちょっと飽きてきた…。
続くかもしれない

0 件のコメント: