2009-03-06 10 views
4

私はC++とMFCで書かれたアプリケーションをWindows上でマルチスレッド化しています。場合によっては、デッドロックやこれらのスレッドのために発生する処理されない例外などの苦情を受け取ることがあります。通常はVisual Studio(問題が再現可能な場合)を使用します。そうでない場合はWinDbgを使用して生成されたダンプファイルを分析します。これを行うためのより良い方法はありますか?これを行うために他のツールを使用することはできますか?マルチスレッドアプリケーションのデバッグ

+0

http://stackoverflow.com/questions/9926/analyzing-multithreaded-programsを参照してください。 –

答えて

1

マルチスレッドシステムは複雑で、ブロックされた場所は適切なツールでは作成されません。デッドロックの原因を調べるには、ロック/ロック解除のレコードをテーブルマップに配置します。 "action lock"を開始すると、テーブルに保存されます。unlock ocoursはテーブルからレコードを削除します。サイクルの終わりに、テーブルの状態を記録したり、特定のイベントでこれを行うことができます。
この実装をdllでビルドして、他のプロジェクトでも使用できます。

3

十分な予算があればIntel Thread Checkerをお勧めします。実行中のプログラムを分析し、可能な競合状態を警告するのは素晴らしい仕事です。

詳細については、demonstration videoをご覧ください。

2

私はまだそれを使用していませんが、Relacy Race Detectorはスレッドの問題のいくつかのクラスを追跡するのに非常に便利です。

2

CRITICAL_SECTIONsでデッドロックしている場合は、WinDbgで!locks debugger extensionを使用して、保持されているロックを所有しているスレッドを確認し、kbコマンドを使用してそのスレッドの呼び出しスタックを調べることができます。