Как человек, который только начинает изучать тонкости компьютерной отладки, хоть убей, я не могу понять, как читать текст стека дампа в 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?): - [





Может быть полезно включить пример стека, который вы пытаетесь прочитать. Хороший совет - убедиться, что у вас есть правильные символы отладки для всех модулей, показанных в стеке. Это включает символы для модулей в ОС, Microsoft сделала свой сервер символов общедоступным.
По-настоящему хорошее руководство по интерпретации трассировки стека доступно здесь:
http://www.codeproject.com/KB/debug/cdbntsd2.aspx
Однако даже с таким учебником может быть очень сложно (или почти невозможно) интерпретировать дамп стека без наличия / загрузки правильных символов.
Во-первых, вам нужно настроить правильные символы. Символы позволят вам сопоставить адреса памяти с именами функций. Для этого вам необходимо создать локальную папку на вашем компьютере, в которой вы будете хранить локальный кеш символов (например: C: \ symbols). Затем необходимо указать путь к серверу символов. Для этого просто перейдите в: Файл> Путь к файлу символов и введите:
SRV*c:\symbols*http://msdl.microsoft.com/download/symbols
Вы можете найти дополнительную информацию о том, как правильно настроить символы здесь.
После того, как вы правильно настроили сервер символов, вы можете открыть минидамп из: Файл> Открыть аварийный дамп.
Как только минидамп открыт, он покажет вам в левой части командной строки поток, который выполнялся при создании дампа. Если вы хотите увидеть, что выполнял этот поток, введите:
kpn 200
Это может занять некоторое время при первом запуске, так как в первый раз необходимо загрузить необходимые общедоступные символы, связанные с Microsoft. Как только все символы будут загружены, вы получите что-то вроде:
01 MODULE!CLASS.FUNCTIONNAME1(...)
02 MODULE!CLASS.FUNCTIONNAME2(...)
03 MODULE!CLASS.FUNCTIONNAME3(...)
04 MODULE!CLASS.FUNCTIONNAME4(...)
Где:
Вы также можете увидеть что-то вроде
01 MODULE!+989823
Это указывает на то, что у вас нет правильного символа для этой DLL, и поэтому вы можете видеть только смещение метода.
Итак, что такое стек вызовов?
Представьте, что у вас есть этот код:
void main()
{
method1();
}
void method1()
{
method2();
}
int method2()
{
return 20/0;
}
В этом коде method2 в основном выдает исключение, поскольку мы пытаемся разделить на 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 предлагает публичный доступ к своим символам, поэтому я полагаю, что вы не сможете получить здесь много информации.
Я рекомендую вам запустить «КПН 200». Это покажет вам полный стек вызовов, и вы сможете увидеть происхождение метода, вызвавшего этот сбой (если это была Microsoft DLL, у вас должны быть соответствующие символы в шагах, которые я вам предоставил).
По крайней мере, вы знаете, что это связано с ошибкой NVIDIA ;-) Попробуйте обновить библиотеки DLL этого драйвера до последней версии.
Если вы хотите узнать больше об отладке WinDBG, я рекомендую следующие ссылки:
Это потрясающий ответ. ТАК должно быть больше таких ответов.