Как взять хороший аварийный дамп для .NET?

Я захватил аварийную дамп моего 32-битного .NET-приложения, работающего в 64-разрядной операционной системе Windows. Во время анализа кто-то узнал, что у меня 64-битный дамп, и сказал мне, что невозможно проанализировать этот дамп из-за неправильной битности.

При использовании диспетчера задач Windows для создания дампа я не знал, что я делаю что-то неправильно. Это всегда работало для 32-разрядных операционных систем.

Как я могу взять хороший дамп для .NET, особенно с правильной битностью?

Ответ 1

Почему здесь важна битность?

Разрядность имеет значение для приложений .NET по следующим причинам:

  • необходима библиотека DAC (контроль доступа к данным) (mscordakwks.dll) правильной битности. ЦАП с перекрестной разрядностью недоступен.
  • отладчик должен иметь возможность загружать расширение отладки SOS с правильной разрядностью

Невозможно преобразовать дамп из 64 бит в 32 бит, хотя в теории он должен содержать всю необходимую информацию.

Если вам повезет, вы все равно можете попробовать некоторые инструкции

Как определить разрядность приложения?

Если вы не знаете битность, вы можете узнать это следующим образом:

Диспетчер задач Windows 7 показывает *32 в процессах: Windows 7 Task Manager

В диспетчере задач Windows 8 перейдите на вкладку Details и добавьте столбец с именем Platform: Windows 8 Task Manager

Visual Studio показывает разрядность при присоединении к процессу: Bitness in Visual Studio

Process Explorer может быть настроен для отображения столбца Image Type: Bitness in Process Explorer

Инструменты

Программы, которые автоматически определяют разрядность:

Инструменты, которые захватывают дамп с определенной разрядностью:

  • 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: меню не отображается
  • Присоединить к процессу: меню все еще невидимо
  • Разрыв: меню становится видимым (найдите его в разделе "Отладка/Сохранить дамп как")

Почему 64-битные дампы 32-битных приложений вообще?

Вероятно, только для отладки самого слоя WoW64.