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