ターゲット マシンに windbg (Windows デバッガー) をインストールします。デバッガーを起動し、疑わしいプロセスにアタッチしてプログラムを実行し、問題が発生するまで待ちます。問題が発生したら、デバッガーのコマンド ラインで次のコマンドを呼び出します。
!逃げる
これにより、どのスレッドが最も多くの時間を消費しているかがわかります。次に、ほとんどの CPU リソースを消費しているスレッドから、いくつかのスレッド スタックを取得します。
次に例を示します。
0:015> !runaway
ユーザーモード時間 スレッド時間 0:1074 0 日 0:00:21.637 11:137c 0 日 0:00:02.792 4:12c8 0 日 0:00:00.530 9:1374 0 日 0:00:00.046 15:13d0 0 日0:00:00.000 14:1204 0 日 0:00:00.000 13:154c 0 日 0:00:00.000 12:144c 0 日 0:00:00.000 10:1378 0 日 0:00:00.000 8:1340 0 日0:00:00.000 7:12f0 0 日 0:00:00.000 6:12d4 0 日 0:00:00.000 5:12d0 0 日 0:00:00.000 3:12c4 0 日 0:00:00.000 2:12c0 0 日0:00:00.000 1:12b4 0 日 0:00:00.000
ここで、リストの 2 番目のスレッドであるスレッド 11 のコール スタックが必要であると仮定すると、最初にスレッド 11 に切り替えます。これは、~11s と入力することで実行できます。
0:015> ~11s
EAX = 03FBB270 EBX = FFFFFFFF ECX = 00000002 EDX = 00000060 ESI = 00000000 EDI = 000000 EIP = 77475E74 ESP = 0572F60C EBP = 0572F67C IOPL = 0 NV UP EI PL ZR NA PE NC CS 0023 fs=003b gs=0000 efl=00000246 ntdll!KiFastSystemCallRet: 77475e74 c3 ret
kp を実行して、このスレッドのコール スタックを取得します。
0:011> kp
ChildEBP RetAddr
0572f608 77475620 ntdll!KiFastSystemCallRet
0572f60c 75b09884 ntdll!NtWaitForSingleObject+0xc
0572f67c 75b097f2 kernel32!WaitForSingleObjectEx+0xbe
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\Program Files\Mozilla Firefox 3.1 Beta 1\nspr4.dll -
0572f690 10019a0b kernel32!WaitForSingleObject+0x12
WARNING: Stack unwind information not available. Following frames may be wrong.
0572f6ac 10015979 nspr4!PR_MD_WAIT_CV+0x8b
0572f6c4 10015763 nspr4!PR_GetPrimordialCPU+0x79
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\Program Files\Mozilla Firefox 3.1 Beta 1\xul.dll -
0572f6e0 64d44d6a nspr4!PR_Wait+0x33
0572f708 64dbe67e xul!NS_CycleCollectorForget2_P+0x698a
0572f72c 10019b3f xul!gfxWindowsPlatform::FontEnumProc+0xfd4e
0572f734 10015d32 nspr4!PR_MD_UNLOCK+0x1f
0572f738 1001624b nspr4!PR_Unlock+0x22
0572f754 1001838d nspr4!PRP_TryLock+0x4cb
00000000 00000000 nspr4!PR_Now+0x109d
コマンド kp はパラメータを出力します。ローカル変数は dv で出力できます。
または、sysinternals のプロセス エクスプローラーを使用できます。
リモート クライアント マシンであるため、これらすべてが不可能な場合は、userdump をインストールします。これにより、さらに分析するために送信できるダンプ ファイルが作成されます。顧客が正しいパラメータで userdump を呼び出すためのバッチ ファイルを作成できます。Userdump は Microsoft のツールで、Microsoft の Web ページからダウンロードできます。