2011-12-14 65 views
0

我试图从客户调试高CPU问题。我试过让他们使用procdump,但是,它在写入转储时挂起而没有完成。相反,客户在CPU电平飙升时使用键盘启动了完整的内存转储。全内存转储丢失堆栈信息

我希望能够看到所有进程的线程的堆栈跟踪,但我不能看到比任何一个线程的顶级4-6堆栈帧更多。这令人沮丧,因为这些帧只包含由错误检查启动的陷阱例程。我是WinDbg的新手,所以我不确定如何收集这些信息。我通过执行以下操作获取堆栈信息:

2: kd> !process 0 0 process.exe 
PROCESS 8997f590 SessionId: 0 Cid: 094c Peb: 7ffd6000 ParentCid: 01c4 
DirBase: 503f1000 ObjectTable: e53f1880 HandleCount: 1924. 
Image: process.exe 
2: kd> !process 8997f590 
PROCESS 8997f590 SessionId: 0 Cid: 094c Peb: 7ffd6000 ParentCid: 01c4 
DirBase: 503f1000 ObjectTable: e53f1880 HandleCount: 1924. 
[...] 
THREAD 89daf4f0 Cid 094c.0950 Teb: 7ffdf000 Win32Thread: e53f1ae0 WAIT: (Unknown) UserMode Non-Alertable 
8997f8ac NotificationEvent 
[...] 
ChildEBP RetAddr 
    b8cf9c04 8083d26e nt!KiSwapContext+0x26 (FPO: [Uses EBP] [0,0,4]) 
    b8cf9c30 8083dc5e nt!KiSwapThread+0x2e5 (FPO: [Non-Fpo]) 
    b8cf9c78 809208d7 nt!KeWaitForSingleObject+0x346 (FPO: [Non-Fpo]) 
    b8cf9ca0 8093aef7 nt!IopSynchronousServiceTail+0x180 (FPO: [Non-Fpo]) 
    b8cf9d38 8083387f nt!NtReadFile+0x5d5 (FPO: [Non-Fpo]) 
    b8cf9d38 7c82847c nt!KiFastCallEntry+0xfc (FPO: [0,0] TrapFrame @ b8cf9d64) 
WARNING: Frame IP not in any known module. Following frames may be wrong. 
    0012fc58 00000000 0x7c82847c 
[...] 

如果我切换到任何线程的上下文并运行,例如,kb 50我还是会只拿到最前面的几个帧。无论如何要获得其余的调用堆栈?如果它被分页到磁盘,这些信息可能不可用吗?

此外,有关如何调试高CPU使用率的任何提示将有所帮助。

回答

3

尝试:

!process 8997f590 1f 

在这篇文章中,描述了你所遇到的问题:

http://www.osronline.com/article.cfm?id=576

基本上完全内存转储包含许多不同的工艺环境。为了查看用户模式状态,您需要确保调试器使用正确的流程上下文(在这种情况下,0x10标志将执行此操作)。

在调试高CPU利用率方面,!process 0 1将显示每个进程的用户和内核CPU时间。如果一组特定的进程在加标,应该从输出中清楚。然而,更好的方法是跟踪这个问题,但可能是xperf,它会在一段时间内对CPU进行采样(而不是像在这里一样只是在快速查看快照)。

-scott

+0

谢谢斯科特,修好了! – ReferentiallySeethru 2011-12-14 21:36:29