1. Администрация SafeZone приветствует вас на нашем форуме!
    Если вы больше не желаете видеть рекламу при просмотре тем и сообщений - то достаточно просто зарегистрироваться. Для зарегистрированных пользователей реклама не отображается.
    Если у вас возникли проблемы с регистрацией на форуме - то вы можете сообщить об этом с помощью этой формы без авторизации,администрация форума обязательно отреагирует на вашу проблему.
    Скрыть объявление

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

Тема в разделе "Другие языки программирования", создана пользователем Dragokas, 13 апр 2017.

  1. Dragokas

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    5.279
    Симпатии:
    5.154
    Что такое дамп

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

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

    Если программа создана с отладочными символами, разработчик по дампу может увидеть место в исходном коде и стек вызова функций на момент падения программы. Например, вот какой результат мы увидим при анализе дампа в WinDbg (попытка разыменовать нулевой указатель):
    Код (Text):


    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 Roporting). Поддерживается в Windows Vista и выше.

    1.1. Примените такой твик (файл .reg):
    Код (Microsoft Registry):
    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
    "CustomDumpFlags"=dword:00009b67
    "DumpCount"=dword:0000000a
    "DumpType"=dword:00000001
    (либо скачайте и примените готовый твик из архива во вложении 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, например, командой:
    Код (Text):

    cd /d "c:\ProcDump"
     
    Выполните такую команду (в примере, имя сбойной программы HiJackThis - вам нужно поменять на своё):
    Код (Text):

    procdump.exe -accepteula -ma -l -o -e -w -x . "HiJackThis.exe"
     
    Дамп будет создан в этой же папке.

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

    Введите команду:
    Код (Text):

    procdump -accepteula -i -ma -kill
     
    Вы должны увидеть сообщение:
    Запустите сбойное приложение.

    Для удаления внешнего отладчика выполните команду:
    Код (Text):

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

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

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

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

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

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

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

    Вложения:

    Последнее редактирование: 13 апр 2017
    E100, Sandor, Кирилл и ещё 1-му нравится это.
  2. regist

    regist гоняюсь за туманом Ассоциация VN/VIP VIP Разработчик

    Сообщения:
    11.777
    Симпатии:
    5.581
    1) Надо бы добавить твик для отмены этого действия. А то потом при падение любой программы будет забиваться дампами, а увы, не каждому разработчику можно послать для доработки.
    2) Предупредить, что твик перепишет настройки если раньше уже были в системе.
     
    Dragokas нравится это.

Поделиться этой страницей

Загрузка...