13

SOS を使用して、WinDbg で ASP.NET プロセスのミニダンプを調べています。マネージド スレッドを一覧表示すると、通常のスレッドの一覧が表示されます。

0:000> !threads
ThreadCount: 8
UnstartedThread: 0
BackgroundThread: 8
PendingThread: 0
DeadThread: 0
Hosted Runtime: no
                                              PreEmptive                                                Lock
       ID OSID        ThreadOBJ     State   GC     GC Alloc Context                  Domain           Count APT Exception
XXXX    1 12bc 00000000001441f0   1808220 Disabled 0000000140b10fc8:0000000140b12f20 000000000017f6e0     0 Ukn (Threadpool Worker)
XXXX    2 1334 0000000000152f90      b220 Enabled  0000000000000000:0000000000000000 0000000000121b90     0 Ukn (Finalizer)
XXXX    3 138c 000000000017b100    80a220 Enabled  0000000000000000:0000000000000000 0000000000121b90     0 Ukn (Threadpool Completion Port)
XXXX    4  81c 000000000017eb40      1220 Enabled  0000000000000000:0000000000000000 0000000000121b90     0 Ukn
XXXX    5  5e4 00000000001bccd0   880a220 Enabled  0000000000000000:0000000000000000 0000000000121b90     0 Ukn (Threadpool Completion Port)
XXXX    6 11e4 0000000004bee280   180b220 Disabled 0000000000000000:0000000000000000 0000000000121b90     0 Ukn (Threadpool Worker)
XXXX    7  73c 0000000004c267e0   180b220 Disabled 0000000140b0f158:0000000140b10f20 000000000017f6e0     3 Ukn (Threadpool Worker) System.StackOverflowException (000000007fff0138) (nested exceptions)
XXXX    8  21c 00000000001ad1c0   180b220 Enabled  0000000000000000:0000000000000000 0000000000121b90     0 Ukn (Threadpool Worker)

ただし、スレッド 7 (例外のあるスレッド) に切り替えようとすると、次のようになります。

0:000> ~7s
        ^ Illegal thread error in '~7s'

これは、マネージド スレッドに切り替えようとしたときに発生します。ここからどこに進むべきかわかりません。私が実際に行う必要があるのは、そのマネージド スレッドからのスタック トレースを確認することです。

4

1 に答える 1

11

からの出力には!threads、スレッドの3つの異なるID(WinDbgのID、管理対象ID、およびネイティブID)が表示されます。使用する必要があるのは左端です。ご覧のとおり、ダンプ内のすべてのスレッドは、XXXX使用できなくなったことを意味するものとしてマークされています。これは正常ですが、すべてのスレッドがそのようにマークされているのは奇妙だと思います。プロセスのシャットダウン中にダンプが取られましたか?

コメントに基づく更新

で便利なダンプを取得できるはずですがadplus -crash、ファイナライザスレッドでさえ終了しているため、ここでは明らかにすべてが少し混乱しています。スレッドの1つにStackoverflowExceptionがあることに気付きました。これは、おそらくあなたが求めているものです。これを取得するには、最初のチャンスの例外でダンプを作成し、その方法でもっと便利なものが得られるかどうかを確認します。AdplusにはそのFullOnFirstためのフラグがあります。

追加の更新

さて、それ奇妙です。他に試すべきことがいくつかあります。

  • クラッシュする前にプロセスにアタッチし、そのままにしgます。これは、例外でデバッガーに侵入するはずです。必要に応じて、例外をコンソールに出力するだけのイベントを設定できます。を使用しsxe -c "!pe; !clrstack; gn" clrます。

  • Adplusは以前はvbsスクリプトでしたが、しばらく前に実行可能ファイルとして書き直されました。新しいバージョンでいくつかの小さな問題が発生しましたが、このような問題はありません。adplus_old.vbsとしてまだ利用可能な古いスクリプトを試すことができます。

  • sysinternalsからprocdumpを試してください。Adplusと同じ種類のダンプオプション(およびさらにいくつか)をサポートします。

于 2012-07-10T15:20:21.030 に答える