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

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

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

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


person Thomas Weller    schedule 21.07.2014    source источник


Ответы (1)


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

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

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

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

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

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

Если разрядность не известна, узнать ее можно так:

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

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

Visual Studio показывает разрядность при подключении к процессу: Разрядность в 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.

person Thomas Weller    schedule 21.07.2014
comment
Возможно, добавьте, как вы можете определить, является ли процесс 32-битным или 64-битным - например, в диспетчере задач win8 вам нужно показать столбец Platform, чтобы определить это. Также в своем заголовке How to take a good..., возможно, стоит использовать слово "правильно" вместо слова "хорошо". - person wal; 22.07.2014