2011-12-14 66 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