Как получить аварийный дамп

Мне нужно получить аварийный дамп из программы. Как я могу получить это? Программа написана на C#. Что такое аварийный дамп? Когда он создан? Где это сохранено? Как мне это прочитать?

5 ответов

Решение

Поскольку вы говорите C#, я предполагаю, что вы используете платформу Windows.

Аварийный дамп или просто дамп - это полный снимок памяти и другая системная информация о процессе в определенный момент времени. Дампы могут использоваться для отладки программных сбоев, зависаний, утечек памяти и ресурсов и, возможно, других проблем, которые я здесь не перечислял.

В случае сбоев и зависаний первым фрагментом данных, который вы хотите получить из аварийного дампа, будет стек вызовов. Это указывает на точку сбоя или точку, в которой операция заблокирована и никогда не возвращается, поэтому программа сидит и ничего не делает.

В случае утечек ресурсов за определенный период времени можно собрать несколько дампов памяти процесса и проверить, какие объекты в памяти растут больше всего. Это может помочь сузить, какие части кода вызывают утечку. Чтобы узнать больше об отладке определенных проблем, я настоятельно рекомендую этот блог.

Есть несколько способов захвата файла дампа.

  1. Procdump ( http://technet.microsoft.com/en-us/sysinternals/dd996900.aspx)
  2. Visual Studio 2010 ( http://msdn.microsoft.com/en-us/library/vstudio/fk551230(v=vs.100).aspx)
  3. WinDbg - Не плохо, но более пугающе, чем другие инструменты

С procdump вы можете просто сделать:

c:\>procdump.exe -ma YourProcessName.exe

Результатом этой команды будет полный снимок памяти YourProcessName.dmp, записанный в c:\ . Ключ -ma указывает на сброс полного образа памяти. Если вы отлаживаете сбой или зависание, вы, вероятно, можете обойтись без ключа -ma. Имейте в виду, что без полного дампа памяти при изучении структур данных у вас, вероятно, не будет действительных данных. Без полного дампа памяти у вас все еще будут данные стека вызовов, которые часто достаточно хороши для сбоев и зависаний. Я, как правило, ошибка на стороне жесткого диска дешево, так что собирать полный дамп.

Procdump также автоматически принимает дампы через определенные промежутки времени или при выполнении определенного условия. Прочитайте документацию по ссылке выше для получения дополнительной информации. Один переключатель я бы порекомендовал это -e,

c:\>procdump.exe -ma -e YourProcessName.exe

Вместо того, чтобы записывать дамп немедленно, он будет записывать его только при сбое вашей программы.

В Visual Studio 2010 вы можете присоединиться к процессу с помощью отладчика и сохранить файл дампа. (Имейте в виду, когда вы отлаживаете F5 вашу программу, Visual Studio автоматически присоединяется). Когда ваша программа находится в "состоянии останова" (точка останова, необработанное исключение, сбой), Debug меню будет иметь возможность Save Dump As..., Затем вы можете сохранить этот дамп в любом месте, где вы хотите.

Поскольку вы упомянули C#, вы, скорее всего, собираете файлы управляемого дампа. Самый простой способ - использовать Visual Studio 2010. Просто откройте созданный вами файл дампа, как любой другой файл, и начните отладку.

Однако, если это не вариант, вы всегда можете использовать VS2008 или WinDbg с расширениями SOS. Я очень рекомендую Visual Studio 2010, хотя SOS-расширения и WinDbg в целом имеют довольно крутую кривую обучения. Чтобы узнать больше о SOS, ознакомьтесь с этими статьями MSDN здесь и здесь.

Другая причина, по которой я рекомендую использовать Visual Studio или procdump, заключается в том, что они будут собирать ожидаемый вами файл дампа. Я рекомендую избегать использования инструмента "Создать файл дампа" в диспетчере задач. Причина в том, что он будет собирать 64-битные дампы 32-битных процессов, которые слишком сложно отлаживать.

Используйте ADPlus. Он поставляется с инструментами отладки для Windows. Он создаст папки аварийных дампов под своим домашним каталогом. Вы можете проанализировать их с помощью WinDbg впоследствии.

В Windows XP вы можете создать файл дампа с помощью этой утилиты:

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=e089ca41-6a87-40c8-bf69-28ac08570b7e&displaylang=en

После установки перейдите в каталог установки и запустите

userdump PID

из командной строки, где PID - это PID процесса, для которого вы хотите получить аварийный дамп (вы можете найти это в диспетчере задач, но вам может потребоваться добавить столбец в стандартное представление).

Затем этот файл можно открыть в Visual Studio - вам просто нужно убедиться, что у вас есть встроенные символы.

В Windows 7 просто щелкните правой кнопкой мыши процесс в диспетчере задач и выберите "Создать файл дампа"

Вы также можете попробовать использовать WinDbg

http://www.windbg.org/

Аварийный дамп - это когда содержимое оперативной памяти и некоторые части процессора копируются в файл. Этот файл создается в критической точке ошибки и может использоваться для устранения проблемы.

Это работало для меня в прошлом. Это сочетание клавиш для сброса дампа в Windows.

* Start Registry Editor.
* Locate the following registry subkey:
      o HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Services\i8042prt\Parameters
* On the Edit menu, click Add Value, and then add the following registry entry:
      o Name: CrashOnCtrlScroll
        Data Type: REG_DWORD
        Value: 1
* Exit Registry Editor and then restart the computer.

http://vinaytechs.blogspot.com/2010/01/how-to-get-crash-or-hang-dump.html

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

Основной подход заключается в регистрации всей трассировки стека, когда происходит исключение, чтобы вы могли позже исследовать и посмотреть, какой метод дал сбой и какое исключение вызвала, какие значения параметров были и так далее. На самом деле это не просто сокрушительный дамп, но во многих случаях это очень помогает.

MS недавно разработала кое-что для аварийных дампов и сбоев приложений, я думаю, что это на самом деле связано с Windows 7...

см. здесь: Восстановление приложений и перезагрузка

http://msdn.microsoft.com/en-us/library/cc948909(v=vs.85).aspx

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