Интерпретация стеков в минидампах Windows

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
9
0
6 574
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Может быть полезно включить пример стека, который вы пытаетесь прочитать. Хороший совет - убедиться, что у вас есть правильные символы отладки для всех модулей, показанных в стеке. Это включает символы для модулей в ОС, 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(...)

Где:

  • ПЕРВЫЙ НОМЕР: указывает номер кадра
  • МОДУЛЬ: DLL, содержащая код
  • УЧЕБНЫЙ КЛАСС: (только в коде C++) покажет вам класс, содержащий код
  • ИМЯ ФУНКЦИИ: метод, который был вызван. Если у вас есть правильные символы, вы также увидите параметры.

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

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, я рекомендую следующие ссылки:

Это потрясающий ответ. ТАК должно быть больше таких ответов.

1800 INFORMATION 17.09.2008 08:45

Другие вопросы по теме