Windows 完全内存转储缺少堆栈信息

Windows 完全内存转储缺少堆栈信息,windows,debugging,windbg,cpu-usage,dump,Windows,Debugging,Windbg,Cpu Usage,Dump,我正试图调试客户的高CPU问题。我已经试着让他们使用procdump,但是,它在编写转储文件时挂起,从未完成。相反,当CPU级别达到峰值时,客户使用键盘启动了完整的内存转储 我希望能够看到所有进程线程的堆栈跟踪,但对于任何一个线程,我只能看到顶部4-6个堆栈帧。这令人沮丧,因为这些帧只包含由错误检查启动的陷阱例程。我是WinDbg的新手,所以我不知道如何收集这些信息。我通过执行以下操作获取堆栈信息: 2: kd> !process 0 0 process.exe PROCESS 8997f

我正试图调试客户的高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
[...]
如果我切换到任何线程的上下文并运行,例如,
kb50
我仍然只会得到最上面的几个帧。是否仍然可以获取其余的调用堆栈?如果该信息被分页到磁盘,是否该信息不可用

此外,任何关于如何调试高CPU使用率的提示都会很有帮助。

试试:

!process 8997f590 1f
本文介绍了您面临的问题:

基本上,完整内存转储包含许多不同的进程上下文。为了查看用户模式状态,您需要确保调试器使用了正确的进程上下文(在本例中0x10标志将执行此操作)

在调试高CPU利用率方面!进程0 1将显示每个进程的用户和内核CPU时间。如果一组特定的进程正在尖峰,那么应该从输出中清除它。但是,跟踪这一点的更好的替代方法可能是xperf,它将在一段时间内对CPU进行采样(而不是像您现在这样只查看快照)

-斯科特

试试:

!process 8997f590 1f
本文介绍了您面临的问题:

基本上,完整内存转储包含许多不同的进程上下文。为了查看用户模式状态,您需要确保调试器使用了正确的进程上下文(在本例中0x10标志将执行此操作)

在调试高CPU利用率方面!进程0 1将显示每个进程的用户和内核CPU时间。如果一组特定的进程正在尖峰,那么应该从输出中清除它。但是,跟踪这一点的更好的替代方法可能是xperf,它将在一段时间内对CPU进行采样(而不是像您现在这样只查看快照)

-斯科特