在目标机器上安装 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
现在假设我们想要列表中的第二个线程线程 11 的调用堆栈,所以我们首先切换到线程 11。这可以通过输入 ~11s 来完成。
0:015> ~11s
EAX = 03FBB270 EBX = FFFFFFFF ECX = 00000002 EDX = 00000060 ESI = 00000000 EDI = 00000000 EIP = 77475CE74 ESP = 0572F60C EBP = 0572F67C IOPL = 0 NV向上EI PL ZR NA PE NC CS = 001B SS = 0023 DS = 0023 ES = 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 是微软的一个工具,可以从他们的网页下载。