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

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

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

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

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 колонка: Битность в 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: меню невидимо
  • Присоединить к процессу: меню все еще невидимо
  • Break: меню становится видимым (найдите его в Debug / Save dump as)

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

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

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