Как мне получить хороший аварийный дамп для.NET?
Я записал аварийный дамп моего 32-разрядного приложения.NET, работающего в 64-разрядной операционной системе Windows. Во время анализа кто-то обнаружил, что у меня есть 64-разрядный дамп, и сказал, что невозможно проанализировать этот дамп из-за неправильной разрядности.
При использовании диспетчера задач Windows для создания дампа я не осознавал, что что-то не так делаю. Это всегда работало для 32-битных операционных систем.
Как я могу получить хороший дамп для.NET, особенно с правильной разрядностью?
1 ответ
Почему здесь важна битность?
Разрядность имеет значение для приложений.NET по следующим причинам:
- необходима библиотека DAC (контроль доступа к данным) (mscordakwks.dll) правильной битности. ЦАП с перекрестной разрядностью отсутствует.
- отладчик должен иметь возможность загружать расширение отладки SOS с правильной битностью
Невозможно преобразовать дамп из 64 бит в 32 бит, хотя теоретически он должен содержать всю необходимую информацию.
Если вам повезет, вы также можете попробовать некоторые инструкции
Как определить разрядность приложения?
Если вы не знаете битность, вы можете узнать это так:
Диспетчер задач Windows 7 показывает *32
по процессам:
В диспетчере задач Windows 8 перейдите к Details
вкладка и добавить столбец с именем Platform
:
Visual Studio показывает разрядность при присоединении к процессу:
Process Explorer может быть настроен для отображения Image Type
колонка:
инструменты
Программы, которые автоматически определяют битность:
- Process Explorer
- ProcDump
- Microsoft Visual Studio
- Отчеты об ошибках Windows LocalDumps
Инструменты, которые захватывают дамп с определенной битностью:
- 64-разрядная версия: диспетчер задач по умолчанию в 64-разрядной ОС
- 32-разрядная версия: диспетчер задач запускается из%windir%\SysWOW64\taskmgr.exe в 64-разрядной ОС
- 64 бит: ProcDump запускается с
-64
переключатель командной строки - 32 бит: версия WinDbg x86
- 64-разрядная версия: WinDbg x64 версия
- 32-битная версия DebugDiag x86
- 64-разрядная версия: версия DebugDiag x64
- 32-разрядная версия: версия ADPlus x86
- 64-разрядная версия: версия ADPlus x64
Просто выберите битность в соответствии с вашим приложением, а не в соответствии с ОС.
Почему память здесь важна?
Для.NET вам нужен полный дамп памяти, иначе вы не сможете выяснить содержимое объектов. Чтобы включить полную память, сделайте следующее:
- в WinDbg укажите
/ma
когда делаешь.dump
- в Process Explorer выберите "Создать полный дамп" (хотя технически результат по-прежнему минимальный)
- в ProcDump примените
-ma
переключатель командной строки - в Visual Studio выберите "Минидамп с кучей"
- Диспетчер задач всегда будет создавать дамп с полной памятью
- Для отчетов об ошибках Windows установить LocalDumps
DumpType
в2
Visual Studio инструкции
Я обнаружил, что многие разработчики даже не знают, что Visual Studio может создавать дампы. Вероятно, причина в том, что меню уже давно невидимо. Вот эти шаги:
- Запустите Visual Studio: меню невидимо
- Присоединить к процессу: меню все еще невидимо
- Break: меню становится видимым (найдите его в Debug / Save dump as)
Почему 64-битные дампы 32-битных приложений вообще?
Вероятно, только для отладки самого слоя WoW64.