Одна вещь, которую вы можете сделать, чтобы повысить точность стеков вызовов, найденных в дампах, - это использовать отладчик, отличный от Visual Studio, в частности, использовать WinDbg или другой инструмент, который использует механизм отладки Windows Debugger, найденный в dbgeng.dll (в отличие от Механизм отладки отладчика Visual Studio, который использует Visual Studio).
По нашему опыту, WinDbg на 100% надежен в создании хороших стеков вызовов из тех же дампов, где Visual Studio создает непригодные или совершенно неточные стеки вызовов. Насколько я могу судить, в тех случаях, когда источником сбоя является необработанное исключение, WinDbg автоматически выполняет сложный процесс реконструкции / восстановления стека вызовов исключения, но Visual Studio этого не делает (или не может?). Два отладчика используют разными эвристиками для интерпретации стеков < / а>
Поначалу WinDbg может показаться сложным, поэтому вот мое краткое руководство о том, как упростить его или даже избежать необходимости использовать его напрямую.
Руководство простого смертного по извлечению хороших стеков вызовов
Они упорядочены от самого быстрого / самого простого к самому медленному / самому загадочному для интерпретации.
- Самый простой вариант: используйте DbgDiag от Microsoft
Это малоизвестный инструмент, который автоматизирует анализ часто встречающихся проблем, и его достаточно просто передать непрограммистам или даже клиентам. Он быстрый и почти надежный, и стал моим любимым инструментом для быстрого анализа входящего аварийного дампа.
- Запустите приложение DebugDiag Analysis.
- Установите флажок CrashHangAnalysis на главной странице.
- Перетащите дамп на панель файлов данных на главной странице.
- Нажмите Начать анализ.
Через несколько секунд или нескольких минут он выдаст красивый файл .mhtml, содержащий анализ проблемы, информацию обо всех связанных потоках, полных стеках вызовов и т. д. Все ссылки имеют гиперссылки и просты в использовании.
DebugDiag даже автоматизирует некоторые из более сложных анализов, которые возможны, но болезненны в WinDbg (например, отслеживание того, какой из 350 потоков в вашем приложении отвечает за тупик).
Примечание. Chrome не будет загружать и открывать файлы .mhtml по соображениям безопасности, поэтому вы должны открывать их в Internet Explorer или Microsoft Edge, чтобы его можно было использовать. Это раздражает, и я отправил запрос в команду DebugDiag ([email protected]) на изменение формата на простой HTML
- Средний вариант: установить WinDbg в качестве альтернативного механизма отладки для Visual Studio
- Установите Visual Studio, если он еще не установлен. Это нужно сделать перед следующим шагом.
- Установите Драйвер Windows). Комплект (WDK)
- Запустите Visual Studio и (эта часть важна!) используйте новую опцию Файл - ›Открыть -› Crash Dump ..., чтобы открыть дамп. Это отладит аварийный дамп с помощью отладчика Windows (, если вместо этого вы перетащите дамп в Visual Studio или воспользуетесь стандартной опцией File - ›Open -› File ..., чтобы открыть дамп, он выполнит отладку он использует старый механизм отладки Visual Studio ... поэтому будьте осторожны, выбирая правильный вариант).
- Теперь вы должны иметь возможность видеть правильный стек вызовов и перемещаться по нему с помощью графического интерфейса Visual Studio, хотя некоторые вещи работают по-другому (окна просмотра требуют использования незнакомого синтаксиса WinDbg, идентификаторы потоков другие и т. Д.). Примечание. Пользовательский интерфейс Visual Studio может работать очень медленно, особенно если задействовано много потоков и окна «потоки» или «параллельные стеки» открыты.
- Хардкорный вариант: напрямую использовать WinDbg
- Запустите WinDbg.exe
- Перетащите дамп в окно WinDbg.
- Введите
!analyze -v
и нажмите Enter. Через некоторое время WinDbg выдаст стек вызовов сбоя, а также свою оценку источника проблемы. Если вы анализируете тупик, вы можете попробовать !analyze -v -hang
, и WinDbg часто покажет вам задействованную цепочку зависимостей.
На этом этапе у вас может быть вся необходимая информация! Однако, если вы затем захотите проверить состояние процесса в отладчике Visual Studio, вы можете предпринять следующие дополнительные шаги:
- Откройте аварийный дамп в Visual Studio
- Щелкните правой кнопкой мыши в окне стека вызовов и выберите «Перейти к разборке».
- Вставьте шестнадцатеричный адрес из верхней строки выходного стека вызовов WinDbg в адресную строку окна дизассемблирования и нажмите ввод. Теперь вы находитесь на месте аварии и смотрите на дизассемблированный код.
- Щелкните правой кнопкой мыши в окне дизассемблирования и выберите «Перейти к исходному коду», чтобы перейти к исходному коду местоположения. Теперь вы смотрите на исходный код на месте крушения.
Примечание: все вышеперечисленное требует настройки правильных путей к серверу символов, иначе вы не сможете разрешить символы в стеках вызовов. Я рекомендую установить переменную среды _NT_SYMBOL_PATH, чтобы он был автоматически доступен для Visual Studio, WinDbg и DebugDiag.
person
Chris Kline
schedule
28.10.2015