Как создать дамп падения программы в ОС Windows

Dragokas

Angry & Scary Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
8,030
Решения
14
Реакции
6,805
Что такое дамп

Дамп падения программы (файл .dmp) позволяет разработчику проанализировать причины сбоя, приведшие к нештатному (аварийному) завершению программы.

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

Если программа создана с отладочными символами, разработчик по дампу может увидеть место в исходном коде и стек вызова функций на момент падения программы. Например, вот какой результат мы увидим при анализе дампа в WinDbg (попытка разыменовать нулевой указатель):
Код:
Microsoft (R) Windows Debugger Version 10.0.14321.1024 AMD64
Copyright (c) Microsoft Corporation. All rights reserved.


Loading Dump File [H:\_AVZ\Наши разработки\HiJackThis\beta\2.0.7\Bugs\GetHJT_dump\HiJackThis.exe_170412_234019.dmp]
User Mini Dump File with Full Memory: Only application data is available

Comment: '
*** procdump.exe  -accepteula -ma -l -o -e -w -x . HiJackThis.exe /silentautolog
*** Unhandled exception: C0000005.ACCESS_VIOLATION'
Symbol search path is: srv*
Executable search path is:
Windows 7 Version 7601 (Service Pack 1) MP (8 procs) Free x86 compatible
Product: WinNt, suite: SingleUserTS
Machine Name:
Debug session time: Wed Apr 12 23:40:20.000 2017 (UTC + 3:00)
System Uptime: 0 days 8:19:25.472
Process Uptime: 0 days 0:00:01.000
..............................
Loading unloaded module list
.
This dump file has an exception of interest stored in it.
The stored exception information can be accessed via .ecxr.
(2270.200): Access violation - code c0000005 (first/second chance not available)
eax=0018f4c0 ebx=00000001 ecx=00000001 edx=00000000 esi=00000000 edi=0018f4c0
eip=770b8a5b esp=0018f4a8 ebp=0018f7ac iopl=0         nv up ei pl nz na po nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00010202
ntdll!RtlMoveMemory+0x1b:
770b8a5b f3a5            rep movs dword ptr es:[edi],dword ptr [esi]
0:000> !analyze -v
*******************************************************************************
*                                                                             *
*                        Exception Analysis                                   *
*                                                                             *
*******************************************************************************

*** ERROR: Symbol file could not be found.  Defaulted to export symbols for msvbvm60.dll -

DUMP_CLASS: 2

DUMP_QUALIFIER: 400

CONTEXT:  (.ecxr)
eax=0018f4c0 ebx=00000001 ecx=00000001 edx=00000000 esi=00000000 edi=0018f4c0
eip=770b8a5b esp=0018f4a8 ebp=0018f7ac iopl=0         nv up ei pl nz na po nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00010202
ntdll!RtlMoveMemory+0x1b:
770b8a5b f3a5            rep movs dword ptr es:[edi],dword ptr [esi]
Resetting default scope

FAULTING_IP:
ntdll!RtlMoveMemory+1b
770b8a5b f3a5            rep movs dword ptr es:[edi],dword ptr [esi]

EXCEPTION_RECORD:  (.exr -1)
ExceptionAddress: 770b8a5b (ntdll!RtlMoveMemory+0x0000001b)
   ExceptionCode: c0000005 (Access violation)
  ExceptionFlags: 00000000
NumberParameters: 2
   Parameter[0]: 00000000
   Parameter[1]: 00000000
Attempt to read from address 00000000

DEFAULT_BUCKET_ID:  NULL_POINTER_READ

PROCESS_NAME:  HiJackThis.exe

ERROR_CODE: (NTSTATUS) 0xc0000005 - <Unable to get error code text>

EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - <Unable to get error code text>

EXCEPTION_CODE_STR:  c0000005

EXCEPTION_PARAMETER1:  00000000

EXCEPTION_PARAMETER2:  00000000

FOLLOWUP_IP:
HiJackThis!modMain::DoCrash+17 [H:\_AVZ\1673~1\HIJACK~1\beta\202C0A~1.7\modMain.bas @ 10085]
00585f27 ff15e8104000    call    dword ptr [HiJackThis!_imp___vbaSetSystemError (004010e8)]

READ_ADDRESS:  00000000

BUGCHECK_STR:  NULL_POINTER_READ

WATSON_BKT_PROCSTAMP:  58ed263b

WATSON_BKT_PROCVER:  2.6.0.19

PROCESS_VER_PRODUCT:  HiJackThis

WATSON_BKT_MODULE:  ntdll.dll

WATSON_BKT_MODSTAMP:  589c957a

WATSON_BKT_MODOFFSET:  58a5b

WATSON_BKT_MODVER:  6.1.7601.23677

MODULE_VER_PRODUCT:  Microsoft® Windows® Operating System

BUILD_VERSION_STRING:  6.1.7601.23677 (win7sp1_ldr.170209-0600)

MODLIST_WITH_TSCHKSUM_HASH:  b63b57a1d36f78f1439d9886be89df4522d7a614

MODLIST_SHA1_HASH:  480f2eafb00da531c8d5dba5aa25980031183560

NTGLOBALFLAG:  70

APPLICATION_VERIFIER_FLAGS:  0

PRODUCT_TYPE:  1

SUITE_MASK:  272

DUMP_FLAGS:  8000c07

DUMP_TYPE:  0

ANALYSIS_SESSION_HOST:  ALEX-PC

ANALYSIS_SESSION_TIME:  04-12-2017 23:41:10.0400

ANALYSIS_VERSION: 10.0.14321.1024 amd64fre

THREAD_ATTRIBUTES:
OS_LOCALE:  RUS

PROBLEM_CLASSES:



NULL_POINTER_READ
    Tid    [0x200]
    Frame  [0x00]: ntdll!RtlMoveMemory


LAST_CONTROL_TRANSFER:  from 00585f27 to 770b8a5b

STACK_TEXT:
0018f4ac 00585f27 0018f4c0 00000000 00000004 ntdll!RtlMoveMemory+0x1b
0018f4c0 0059b15c 0018f7b8 0018f888 00000001 HiJackThis!modMain::DoCrash+0x17
0018f7ac 72991d33 0038a520 0018f7c8 00423776 HiJackThis!frmMain::Form_Load+0x350c
WARNING: Stack unwind information not available. Following frames may be wrong.
0018f7c8 72992034 00423776 0018f884 00000002 msvbvm60!IID_IVbaHost+0x236f3
0018f7e0 7299211a 0038a75c 0018f8c4 0018f884 msvbvm60!IID_IVbaHost+0x239f4
0018f8e8 72992667 02023b24 02021d5c 020165a8 msvbvm60!IID_IVbaHost+0x23ada
0018f90c 729721b7 02023b24 00000006 0018f92c msvbvm60!IID_IVbaHost+0x24027
0018f968 72971ead 02aa07e4 00000000 00000000 msvbvm60!IID_IVbaHost+0x3b77
0018f988 729a48d1 02aa07e4 0201b70c 00000000 msvbvm60!IID_IVbaHost+0x386d
0018f9dc 729a7205 02021d5c 0038a520 0018fa1c msvbvm60!IID_IVbaHost+0x36291
0018fadc 72991d33 00314c80 0018faf8 0041a111 msvbvm60!IID_IVbaHost+0x38bc5
0018faf8 72992034 0041a111 0018fbb4 00000002 msvbvm60!IID_IVbaHost+0x236f3
0018fb10 7299211a 00314ccc 0018fbf4 0018fbb4 msvbvm60!IID_IVbaHost+0x239f4
0018fc18 72992667 02021534 02020ca4 020165a8 msvbvm60!IID_IVbaHost+0x23ada
0018fc3c 729721b7 02021534 00000006 0018fc5c msvbvm60!IID_IVbaHost+0x24027
0018fc98 72971ead 02aa07e4 00000000 00000000 msvbvm60!IID_IVbaHost+0x3b77
0018fcb8 729a48d1 02aa07e4 0201b5ec 00000000 msvbvm60!IID_IVbaHost+0x386d
0018fd10 729aff18 0018fd48 00000001 02aa07e4 msvbvm60!IID_IVbaHost+0x36291
0018fd4c 7295e703 02020ca4 00000001 0068c72c msvbvm60!IID_IVbaHost+0x418d8
0018fe9c 72947b3e 02aa07e4 004174f0 020107e4 msvbvm60!Zombie_Release+0xfcaa
0018fec0 72943981 004174f0 00000000 004174f0 msvbvm60!BASIC_CLASS_QueryInterface+0xeca
0018fee0 729436fa 00400000 00400000 00000000 msvbvm60!ThunRTMain+0x3dd
0018ff00 72943600 00000000 00400000 00000000 msvbvm60!ThunRTMain+0x156
0018ff80 00416c36 004174f0 76a3336a 7efde000 msvbvm60!ThunRTMain+0x5c
0018ff94 77099902 7efde000 76c7e7ca 00000000 HiJackThis!__vbaS+0xa
0018ffd4 770998d5 00416c2c 7efde000 00000000 ntdll!__RtlUserThreadStart+0x70
0018ffec 00000000 00416c2c 7efde000 00000000 ntdll!_RtlUserThreadStart+0x1b


THREAD_SHA1_HASH_MOD_FUNC:  e8cc842f7d5a20bc043c6fad12f5ba2fb08bcb4a

THREAD_SHA1_HASH_MOD_FUNC_OFFSET:  d6233098d398cbf847a00c7f17ee84d737b52f95

THREAD_SHA1_HASH_MOD:  16304f32e2c3a9bb2028604a8b3897def57b6479

FAULT_INSTR_CODE:  10e815ff

FAULTING_SOURCE_LINE:  H:\_AVZ\1673~1\HIJACK~1\beta\202C0A~1.7\modMain.bas

FAULTING_SOURCE_FILE:  H:\_AVZ\1673~1\HIJACK~1\beta\202C0A~1.7\modMain.bas

FAULTING_SOURCE_LINE_NUMBER:  10085

FAULTING_SOURCE_CODE:
10081:     End If
10082: End Sub
10083:
10084: Public Sub DoCrash()
>10085:     memcpy 0, ByVal 0, 4
10086: End Sub


SYMBOL_STACK_INDEX:  1

SYMBOL_NAME:  hijackthis!modMain::DoCrash+17

FOLLOWUP_NAME:  MachineOwner

MODULE_NAME: HiJackThis

IMAGE_NAME:  HiJackThis.exe

DEBUG_FLR_IMAGE_TIMESTAMP:  58ed263b

STACK_COMMAND:  .ecxr ; kb

BUCKET_ID:  NULL_POINTER_READ_hijackthis!modMain::DoCrash+17

PRIMARY_PROBLEM_CLASS:  NULL_POINTER_READ_hijackthis!modMain::DoCrash+17

FAILURE_EXCEPTION_CODE:  c0000005

FAILURE_IMAGE_NAME:  HiJackThis.exe

BUCKET_ID_IMAGE_STR:  HiJackThis.exe

FAILURE_MODULE_NAME:  HiJackThis

BUCKET_ID_MODULE_STR:  HiJackThis

FAILURE_FUNCTION_NAME:  modMain::DoCrash

BUCKET_ID_FUNCTION_STR:  modMain::DoCrash

BUCKET_ID_OFFSET:  17

BUCKET_ID_MODTIMEDATESTAMP:  58ed263b

BUCKET_ID_MODCHECKSUM:  3eaa52

BUCKET_ID_MODVER_STR:  2.6.0.19

BUCKET_ID_PREFIX_STR:  NULL_POINTER_READ_

FAILURE_PROBLEM_CLASS:  NULL_POINTER_READ

FAILURE_SYMBOL_NAME:  HiJackThis.exe!modMain::DoCrash

FAILURE_BUCKET_ID:  NULL_POINTER_READ_c0000005_HiJackThis.exe!modMain::DoCrash

WATSON_STAGEONE_URL:  http://watson.microsoft.com/StageOne/HiJackThis.exe/2.6.0.19/58ed263b/ntdll.dll/6.1.7601.23677/589c957a/c0000005/00058a5b.htm?Retriage=1

TARGET_TIME:  2017-04-12T20:40:20.000Z

OSBUILD:  7601

OSSERVICEPACK:  23677

SERVICEPACK_NUMBER: 0

OS_REVISION: 0

OSPLATFORM_TYPE:  x86

OSNAME:  Windows 7

OSEDITION:  Windows 7 WinNt (Service Pack 1) SingleUserTS

USER_LCID:  0

OSBUILD_TIMESTAMP:  2017-02-09 18:17:35

BUILDDATESTAMP_STR:  170209-0600

BUILDLAB_STR:  win7sp1_ldr

BUILDOSVER_STR:  6.1.7601.23677

ANALYSIS_SESSION_ELAPSED_TIME: e0a

ANALYSIS_SOURCE:  UM

FAILURE_ID_HASH_STRING:  um:null_pointer_read_c0000005_hijackthis.exe!modmain::docrash

FAILURE_ID_HASH:  {02ecd512-612d-c870-fdc2-5236b80dda87}

Followup:     MachineOwner
---------

Как создать дамп падения программы

Приведу несколько наиболее удобных на мой взгляд способов:

1) Используя подсистему WER (Windows Error Reporting). Поддерживается в Windows Vista и выше.

1.1. Примените такой твик (файл .reg):
Код:
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps]
"DumpFolder"=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,44,00,72,00,69,\
  00,76,00,65,00,25,00,5c,00,43,00,72,00,61,00,73,00,68,00,44,00,75,00,6d,00,\
  70,00,73,00,00,00
"DumpCount"=dword:0000000a
"DumpType"=dword:00000002
(либо скачайте и примените готовый твик из архива во вложении CrashDumps_WER)

1.2. Запустите сбойное приложение.
1.3. Дамп будет создан в папке C:\CrashDumps
1.4. Отмените изменения в реестре, удалив ветку HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps, или примените соответствующий твик из архива во вложении.

Можно также настроить и другие параметры: см. WER Settings (Windows)

2) Используя SysInernals ProcDump.
А.

2.1. Скачайте и распакуйте SysInernals ProcDump.
2.2. В эту же папку положите сбойную программу.
2.3. Запустите командную строку от имени администратора.
2.4. Перейдите в каталог, где у Вас расположена программа ProcDump, например, командой:
Код:
cd /d "c:\ProcDump"
Выполните такую команду (в примере, имя сбойной программы HiJackThis - вам нужно поменять на своё):
Код:
> "dump.log" procdump.exe -accepteula -ma -l -f "" -o -e 1 -w -x . "HiJackThis.exe"
Дамп *.dmp будет создан в этой же папке.
Файл dump.log будет содержать вывод программы ProcDump с дополнительной информацией об ошибках.

Б. Альтернативно, Вы можете настроить систему для автоматического запуска ProcDump в качестве внешнего отладчика. Для этого:

Введите команду:
Код:
procdump -accepteula -i -ma -kill
Вы должны увидеть сообщение:
ProcDump is now set as the Just-in-time (AeDebug) debugger.
Запустите сбойное приложение.

Для удаления внешнего отладчика выполните команду:
Код:
procdump -u

3) Используя в программе API-функцию SetUnhandledExceptionFilter.
Поддерживаются не все языки (например, в VB6 этот способ не работает).

Для этого можете воспользоваться уже готовой DLL-кой от Олега Казакевича (см. приложенный архив CrashDumper).

3.1. Положите рядом со своей программой dbghelp.dll и CrashDumper.dll
3.2. Загрузите в адресное пространство процесса библиотеку CrashDumper.dll (через LoadLibrary) в коде инициализации программы.

Программу, разумеется, нужно распространять именно в таком виде.

----------------------------------------

Важно! Для разработчика:
Дамп программы подходит под отладочные символы строго определённой версии программы.
Поэтому вам нужно сохранять и "откладывать на полочку" отладочные символы (файл .pdb) при каждой компиляции для всех распространяемых версий.
Во время отладки, Вам необходимо расположить файл .pdb соответствующей версии программы в исходную папку, где он лежал в момент компиляции, чтобы отладчик сумел корректно подхватить его.

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

Вложения

Последнее редактирование модератором:
1.1. Примените такой твик (файл .reg):
1) Надо бы добавить твик для отмены этого действия. А то потом при падение любой программы будет забиваться дампами, а увы, не каждому разработчику можно послать для доработки.
2) Предупредить, что твик перепишет настройки если раньше уже были в системе.
 
Поменял твик, чтобы создавал более полный дамп, точнее максимально полный на сколько это возможно.
 
Исправлена командная строка для procdump, чтобы включать более полную детализацию об ошибках, строки отладки, а также останов на First Exception.
А также для создания файла dump.log с содержимим вывода программы ProcDump.
 
Назад
Сверху Снизу