Интерпретация стеков в мини-дампах Windows - PullRequest
8 голосов
/ 17 сентября 2008

Как человек, который только начинает изучать тонкости компьютерной отладки, я не могу понять, как читать текст стека из дампа в Windbg. Я понятия не имею, с чего начать, как их интерпретировать или как это сделать. Кто-нибудь может предложить направление этой бедной душе?

т.е. (единственная свалка, которая у меня есть на руках)

>b69dd8f0 bfa1e255 016d2fc0 89efc000 00000040 nv4_disp+0x48b94

b69dd8f4 016d2fc0 89efc000 00000040 00000006 nv4_disp+0x49255

b69dd8f8 89efc000 00000040 00000006 bfa1dcc0 0x16d2fc0

b69dd8fc 00000000 00000006 bfa1dcc0 e1e71018 0x89efc000

Я знаю, что проблема связана с драйвером дисплея Nvidia, но я хочу знать, как на самом деле читать стек (например, что такое b69dd8f4?): - [

Ответы [ 4 ]

18 голосов
/ 17 сентября 2008

Во-первых, вам нужно настроить правильные символы. Символы позволят вам сопоставить адреса памяти с именами функций. Для этого вам необходимо создать локальную папку на вашем компьютере, в которой вы будете хранить локальный кэш символов (например, C: \ symbols). Затем вам нужно указать путь к серверу символов. Для этого просто зайдите в: Файл> Путь к символьному файлу и введите:

SRV*c:\symbols*http://msdl.microsoft.com/download/symbols

Более подробную информацию о правильной настройке символов вы можете найти здесь .

После того, как вы правильно настроили сервер Symbols, вы можете открыть мини-дамп из: File> Open Crash Dump.

Как только мини-дамп откроется, он покажет вам в левой части командной строки поток, который выполнялся, когда был создан дамп. Если вы хотите увидеть, что выполнял этот поток, наберите:

kpn 200

Это может занять некоторое время при первом запуске, поскольку в первый раз необходимо загрузить необходимые общедоступные символы, относящиеся к Microsoft. Как только все символы будут загружены, вы получите что-то вроде:

01 MODULE!CLASS.FUNCTIONNAME1(...)
02 MODULE!CLASS.FUNCTIONNAME2(...)
03 MODULE!CLASS.FUNCTIONNAME3(...)
04 MODULE!CLASS.FUNCTIONNAME4(...)

Где:

  • ПЕРВЫЙ НОМЕР : Указывает номер кадра
  • MODULE : DLL, содержащая код
  • CLASS : (только для кода C ++) покажет вам класс, содержащий код
  • FUNCTIONAME : Метод, который был вызван. Если у вас есть правильные символы, вы также увидите параметры.

Вы также можете увидеть что-то вроде

01 MODULE!+989823

Это указывает на то, что у вас нет подходящего символа для этой DLL, и поэтому вы можете видеть только смещение метода.

Итак, что такое callstack?

Представьте, что у вас есть этот код:

void main()
{
  method1();
}

void method1()
{
  method2();
}

int method2()
{
  return 20/0;
}

В этом коде метод2 в основном генерирует исключение, так как мы пытаемся разделить на 0, и это приведет к сбою процесса. Если бы мы получили мини-дамп, когда это произошло, мы бы увидели следующий стек вызовов:

01 MYDLL!method2()
02 MYDLL!method1()
03 MYDLL!main()

Вы можете следовать из этого стека вызовов, который "main" вызывал "method1", который затем вызывал "method2", и он не удался.

В вашем случае у вас есть этот стек вызовов (который, я думаю, является результатом выполнения команды "kb")

b69dd8f0 bfa1e255 016d2fc0 89efc000 00000040 nv4_disp+0x48b94
b69dd8f4 016d2fc0 89efc000 00000040 00000006 nv4_disp+0x49255
b69dd8f8 89efc000 00000040 00000006 bfa1dcc0 0x16d2fc0
b69dd8fc 00000000 00000006 bfa1dcc0 e1e71018 0x89efc000

В первом столбце указан указатель на дочерний фрейм, во втором столбце указан адрес возврата метода, который выполняется, в следующих трех столбцах показаны первые 3 параметра, которые были переданы методу, а последней частью является имя DLL (nv4_disp) и смещение выполняемого метода (+ 0x48b94). Поскольку у вас нет символов, вы не можете увидеть название метода. Я сомневаюсь, что NVIDIA предлагает публичный доступ к их символам, поэтому я думаю, что вы не можете получить много информации отсюда.

Я рекомендую вам запустить "kpn 200". Это покажет вам полный стек вызовов, и вы сможете увидеть источник метода, который вызвал этот сбой (если это была DLL-библиотека Microsoft, вы должны иметь правильные символы в шагах, которые я вам предоставил).

По крайней мере, вы знаете, что это связано с ошибкой NVIDIA ;-) Попробуйте обновить DLL этого драйвера до последней версии.

Если вы хотите больше узнать об отладке WinDBG, я рекомендую следующие ссылки:

3 голосов
/ 17 сентября 2008

Очень хороший учебник по интерпретации трассировки стека доступен здесь:

http://www.codeproject.com/KB/debug/cdbntsd2.aspx

Однако даже с таким учебником может быть очень сложно (или почти невозможно) интерпретировать дамп стека без доступных / загруженных надлежащих символов.

2 голосов
/ 17 сентября 2008
0 голосов
/ 17 сентября 2008

Может быть полезно включить пример стека, который вы пытаетесь прочитать. Хороший совет - убедиться, что у вас есть правильные символы отладки для всех модулей, показанных в стеке. Это включает символы для модулей в ОС, Microsoft сделала их сервер символов общедоступным.

...