7

windbg のクラッシュ ダンプを見ると、現在のすべてのスレッドが停止していることがわかります。

> ~2k
ChildEBP RetAddr  
00d2fcc8 7d4e27dc ntdll_7d600000!ZwWaitForMultipleObjects+0x15

または同じの SingleObject バリエーション。

待機するオブジェクトへのハンドルが ZwWaitForMultipleObjects に渡されるので、どのオブジェクトがどのオブジェクトを使用しているかを特定できると仮定しました。

!do <address>

正しいアドレスで -- しかし、正しいアドレスを構築する方法がわかりません。ChildEBP からのオフセットが必要だと思いますか?

4

1 に答える 1

14

次の手順を試してください。

  1. 「~2s」コマンドを使用して、コンテキストをスレッド #2 に切り替えます (この手順はおそらく冗長ですが、適切なスレッド コンテキストで操作する方が簡単です)。

  2. 「kb」コマンドを使用して、各関数の最初の 3 つの引数を含むスレッドのコール スタックを表示します。次のようなものが得られます。

    ChildEBP RetAddr Args から子へ
    0dc7fa30 768b0962 00000004 0dc7fa80 00000001 ntdll!ZwWaitForMultipleObjects+0x15
    0dc7facc 73c61339 0dc7fa80 0dc7fb14 00000000 KERNELBASE!WaitForMultipleObjectsEx+0x100
    
  3. 上記のコール スタックを例にとると、ZwWaitForMultipleObjects に渡されるハンドルの数が 4 (最初の引数の値) であることがわかります。ハンドル配列のアドレスは、2 番目の引数です。上記の例では、アドレスは 0dc7fa80 です。

  4. ハンドル配列の内容を表示するには、「dd」コマンドを使用します。上記のコール スタックの場合、「dd 0dc7fa80」を使用すると、次のようになります。

    0dc7fa80 000001f0 000001f8 0000020c 000001ec
    0dc7fa90 73a53c1b 00000000 0d462f70 00000001
    0dc7faa0 0cf7afe0 00000003 0dc7fac8 00000004
    

    これが 32 ビット プロセスであると仮定すると、ハンドルは最初の 4 つの個別の DWORD (「1f0」、「1f8」、「20c」、および「1ec」) です。

  5. 次のように「!handle」WinDbg 拡張機能を使用して、各ハンドルの詳細を確認できます。

ハンドルがマネージド コードから渡された疑いがある場合は、SOS または PSSCOR を読み込み、!ClrStack コマンドを使用してマネージド コール スタックの詳細を表示する必要があります。

于 2013-05-24T15:22:29.057 に答える