Во-первых, вам нужно настроить правильные символы. Символы позволят вам сопоставить адреса памяти с именами функций. Для этого вам необходимо создать локальную папку на вашем компьютере, в которой вы будете хранить локальный кэш символов (например, 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, я рекомендую следующие ссылки: