Win32 プログラムのデッドロックの診断
-
01-07-2019 - |
質問
Win32 運用プロセスのデッドロックによる明らかなハングをデバッグする手順とテクニックは何ですか。WinDbg をこの目的に使用できると聞きましたが、これを実現する方法について明確なヒントを提供していただけますか?
解決
これ 役職 さまざまなオプションを開始できるはずです。「デバッグ」のタグが付いた投稿を確認してください。
別の役立つ記事 デバッグデッドロック..
他のヒント
ソースとメモリ ダンプ (またはライブ デバッグ セッション) にアクセスできる場合、真のデッドロックをデバッグするのは実際には簡単です。
あなたがすることは、スレッドを見て、ある種の共有リソースを待機しているスレッド (たとえば、ハングアップで待機しているスレッド) を見つけることだけです。 WaitForSingleObject
)。一般的に言えば、そこからは、どの 2 つ以上のスレッドが互いにロックしているかを特定し、次にどのスレッドがロック階層を破壊したかを特定するだけです。
どのスレッドがロックアップされているかを簡単に特定できない場合は、次の方法を使用してください。 この投稿はここにあります 各スレッドのロック チェーンをトレースします。ループに入ると、ループ内のスレッドがデッドロックになります。
非常に面倒な場合は、Application Verifier をインストールし、モジュールを追加して、基本テストから「ロック」だけを選択することもできます。これで、任意のデバッガーでアプリケーションを実行できるようになります。
クリティカルセクションのデッドロックが発生した場合は、その理由をすぐに見つけることができます。
どの言語/IDEを使用していますか?
.Net では、アプリケーションのスレッドを表示できます。「デバッグ」->「Windows」->「スレッド」または Ctrl+Alt+H
デッドロックのデバッグは難しい場合があります。私は通常、何らかのログを作成し、ログがどこで停止するかを確認します。ファイルに記録するか、OutputDebugString() を使用してデバッグ コンソールに記録します。
最善の方法は、ログ ステートメントを追加することから始めることです。一般に、デッドロックしている共有リソースの周囲にのみお勧めしますが、それらを一般に追加すると、予期しない状況やコード領域が示される可能性があります。大きく報道された stackoverflow.com データベースの問題は、実際には log4net の問題であることが判明しました。stackoverflow チームは log4net を疑ったことはなく、ログを調査することによってのみ (皮肉なことに) これを示しました。私の個人的な見解では、WinDgb などの複雑なツールの使用はあまり直感的ではないため、最初は使用しませんでした。