Полная информация о дампе памяти - PullRequest
0 голосов
/ 15 декабря 2011

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

Также были бы полезны любые советы по отладке высокой загрузки ЦП.

1 Ответ

3 голосов
/ 15 декабря 2011

Попробуйте:

!process 8997f590 1f

Проблема, с которой вы столкнулись, описана в этой статье:

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

По сути, полный дамп памяти содержит многоразные контексты процесса.Чтобы увидеть состояние пользовательского режима, вам нужно убедиться, что отладчик использует правильный контекст процесса (что в этом случае будет делать флаг 0x10).

С точки зрения отладки высокой загрузки ЦП,! Process0 1 покажет время процессора пользователя и ядра для каждого процесса.Если наблюдается определенный набор процессов, это должно быть ясно из результатов.Однако лучшей альтернативой для отслеживания этого является, вероятно, xperf, который будет производить выборку процессора за определенный период времени (вместо того, чтобы просто смотреть на снимок во времени, как вы здесь).

-scott

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...