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

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,011
Реакции
5,815
Баллы
648
Что такое дамп

Дамп падения программы (файл .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 содержит полный исходный код программы, поэтому не распространяйте его, если у вас закрытый проект.
 

Вложения

Последнее редактирование модератором:

regist

гоняюсь за туманом
Ассоциация VN/VIP
VIP
Разработчик
Сообщения
12,326
Реакции
5,905
Баллы
998
1.1. Примените такой твик (файл .reg):
1) Надо бы добавить твик для отмены этого действия. А то потом при падение любой программы будет забиваться дампами, а увы, не каждому разработчику можно послать для доработки.
2) Предупредить, что твик перепишет настройки если раньше уже были в системе.
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,011
Реакции
5,815
Баллы
648
Поменял твик, чтобы создавал более полный дамп, точнее максимально полный на сколько это возможно.
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,011
Реакции
5,815
Баллы
648
Исправлена командная строка для procdump, чтобы включать более полную детализацию об ошибках, строки отладки, а также останов на First Exception.
А также для создания файла dump.log с содержимим вывода программы ProcDump.
 
Сверху Снизу