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

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

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

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

12 голосов | спросил Thomas Weller 22 J000000Tuesday14 2014, 00:23:42

1 ответ


0

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

Битность имеет значение для приложений .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: меню становится видимым (найдите его в разделе «Отладка /Сохранить дамп как»)

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

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

ответил Thomas Weller 22 J000000Tuesday14 2014, 00:23:42

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132