Я пытаюсь отладить проблему с высокой загрузкой процессора у клиента. Я пытался заставить их использовать procdump, однако он зависает при записи дампа, даже не заканчивая. Вместо этого клиент инициировал полный дамп памяти, используя клавиатуру, когда уровни процессора резко возросли.
Я бы хотел видеть трассировку стека для всех потоков процесса, но я не могу видеть больше, чем верхние 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
, я все равно получу только несколько верхних кадров. Есть ли способ получить остальную часть стека вызовов? Может ли эта информация быть недоступной, если она была выгружена на диск?
Также были бы полезны любые советы по отладке высокой загрузки ЦП.