- Сообщения
- 8,030
- Решения
- 14
- Реакции
- 6,805
Что такое дамп
Дамп падения программы (файл .dmp) позволяет разработчику проанализировать причины сбоя, приведшие к нештатному (аварийному) завершению программы.
Лучше всего создавать полный дамп. Он содержит снимок всего адресного пространства процесса, таблицу хендлов и пр. важную инфу.
Если программа создана с отладочными символами, разработчик по дампу может увидеть место в исходном коде и стек вызова функций на момент падения программы. Например, вот какой результат мы увидим при анализе дампа в WinDbg (попытка разыменовать нулевой указатель):
Как создать дамп падения программы
Приведу несколько наиболее удобных на мой взгляд способов:
1) Используя подсистему WER (Windows Error Reporting). Поддерживается в Windows Vista и выше.
1.1. Примените такой твик (файл .reg):
(либо скачайте и примените готовый твик из архива во вложении 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, например, командой:
Выполните такую команду (в примере, имя сбойной программы HiJackThis - вам нужно поменять на своё):
Дамп *.dmp будет создан в этой же папке.
Файл dump.log будет содержать вывод программы ProcDump с дополнительной информацией об ошибках.
Б. Альтернативно, Вы можете настроить систему для автоматического запуска ProcDump в качестве внешнего отладчика. Для этого:
Введите команду:
Вы должны увидеть сообщение:
Для удаления внешнего отладчика выполните команду:
3) Используя в программе API-функцию SetUnhandledExceptionFilter.
Поддерживаются не все языки (например, в VB6 этот способ не работает).
Для этого можете воспользоваться уже готовой DLL-кой от Олега Казакевича (см. приложенный архив CrashDumper).
3.1. Положите рядом со своей программой dbghelp.dll и CrashDumper.dll
3.2. Загрузите в адресное пространство процесса библиотеку CrashDumper.dll (через LoadLibrary) в коде инициализации программы.
Программу, разумеется, нужно распространять именно в таком виде.
----------------------------------------
Важно! Для разработчика:
Дамп программы подходит под отладочные символы строго определённой версии программы.
Поэтому вам нужно сохранять и "откладывать на полочку" отладочные символы (файл .pdb) при каждой компиляции для всех распространяемых версий.
Во время отладки, Вам необходимо расположить файл .pdb соответствующей версии программы в исходную папку, где он лежал в момент компиляции, чтобы отладчик сумел корректно подхватить его.
Обычно, файл .pdb содержит полный исходный код программы, поэтому не распространяйте его, если у вас закрытый проект.
Дамп падения программы (файл .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
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"
Код:
> "dump.log" procdump.exe -accepteula -ma -l -f "" -o -e 1 -w -x . "HiJackThis.exe"
Файл 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 содержит полный исходный код программы, поэтому не распространяйте его, если у вас закрытый проект.
Вложения
Последнее редактирование модератором: