2013-05-23 11 views
5

に待っている、私は現在のすべてのスレッドが同じのがwindbgのでクラッシュダンプを見てみると

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

またはSingleObjectバリエーションで停滞していることがわかります。

上に待機するオブジェクトへのハンドルがZwWaitForMultipleObjectsに渡されると、私はそれが正しいアドレスを持つ

!do <address> 

のバリエーションを使用していたどのオブジェクトうち仕事ができることを想定 - 「しかし、私はドン正しいアドレスを構築する方法を知っています。私はChildEBPからいくらか相殺する必要があると仮定していますか?

+2

'!do'は管理対象オブジェクト(.NET)ですが、ZwWFMOはネイティブハンドルを待っている可能性が非常に高いです。 '〜2kb'を使用して、よく文書化されたWin32フレームをスタック(さらにうまくいけばWaitForMultipleObjects)と最初の3つのargsにします。ハンドルを取得するには、2番目の引数をderefする必要があります。ハンドル値を取得すると、 '!handle f'が特定のハンドルに関する情報を取得します。ハンドル値を掘り下げる際に助けが必要な場合は、出力を '〜2kb'に出力してください。 –

答えて

11

次の手順をお試しください:

  1. は#2を通すためにコンテキストを切り替えるには「〜2S」コマンドを使用します(このステップは間違いなく冗長ですが、私はそれが簡単に右のスレッドコンテキストで動作するように見つける。)

  2. "kb"コマンドを使用して、各関数の最初の3つの引数を含むスレッドの呼び出しスタックを表示します。あなたが好きなものを取得します:

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

  4. ハンドル配列の内容を表示するには、 "dd"コマンドを使用します。 「1F0」、「1F8」:これは、ハンドルが最初の4つの個別のDWORDある32ビットプロセスであると仮定すると、

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

    :上記のコールスタックの場合は、のような何かを与えるであろう「DD 0dc7fa80」を使用「20c」、「1ec」である。あなたはそれぞれの詳細がそうのようなWinDbgの拡張「!ハンドル」を使用して扱う見ることができます

  5. :! は、それが持っている場合はFフラグが(その数と名を含む、ハンドルの詳細が表示されます1F0 F を扱いますそれに関連付けられている1)

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

+0

優秀、ありがとうAeham(そしてコメントのためのMarc)。それは最高です。 –

関連する問題