Создайте файл дампа для приложения, когда оно падает - PullRequest
12 голосов
/ 26 января 2012

Я пытаюсь создать файл дампа для моего приложения, когда оно падает. В настоящее время я использую procdump.exe с флагом -e, чтобы сделать это, поэтому, если у меня есть необработанное исключение в моем приложении, procdump создает для меня файл дампа.

Я думал, что все готово, но потом я обнаружил, что мое приложение аварийно завершает работу, и procdump не создает файл дампа. После некоторых исследований я обнаружил, что неправильное использование vector :: front вызывает ошибку во время выполнения. Я включил флаг _SECURE_SCL_THROWS, и после этого procdump.exe -e перехватил сбой и создал файл дампа.

Теперь к моему вопросу: теперь procdump.exe -e всегда создает файл дампа при сбое моего приложения? Как я могу гарантировать, что у меня нет других сценариев, в которых procdump -e мне не подходит?

Ответы [ 2 ]

13 голосов
/ 26 января 2012

Я предполагаю, что вы находитесь в среде Windows (потому что вы используете procdump.exe). Вы также можете установить фильтр исключений для своей программы, который записывает mindump каждый раз, когда происходит сбой приложения:

  1. Зарегистрируйте функцию обратного вызова, используя SetUnhandledExceptionFilter , которая будет вызываться при сбое. Возможная подпись будет:

    LONG WINAPI HandleException(struct _EXCEPTION_POINTERS* apExceptionInfo)
    

    Зарегистрируйте его где-нибудь, используя:

    SetUnhandledExceptionFilter(HandleException);   
    
  2. Определение указателя функции для вызова функции MiniDumpWriteDump :

    typedef BOOL (WINAPI *MINIDUMPWRITEDUMP)(HANDLE hProcess, DWORD dwPid, HANDLE hFile, MINIDUMP_TYPE DumpType,CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,CONSTPMINIDUMP_USER_STREAM_INFORMATIOUserStreamParam,CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam);
    
  3. Используйте функцию MiniDumpWriteDump для записи дампа (требуется DbgHelp.dll 5.1 или более поздней версии) в ранее зарегистрированном методе обратного вызова (HandleException):

    HMODULE mhLib = ::LoadLibrary(_T("dbghelp.dll"));
    MINIDUMPWRITEDUMP pDump = (MINIDUMPWRITEDUMP)::GetProcAddress(mhLib, "MiniDumpWriteDump");
    
    HANDLE  hFile = ::CreateFile(_T("dump_name"), GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS,
                        FILE_ATTRIBUTE_NORMAL, NULL);
    
    
    _MINIDUMP_EXCEPTION_INFORMATION ExInfo;
    ExInfo.ThreadId = ::GetCurrentThreadId();
    ExInfo.ExceptionPointers = apExceptionInfo;
    ExInfo.ClientPointers = FALSE;
    
    pDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &ExInfo, NULL, NULL);
    ::CloseHandle(hFile);
    
6 голосов
/ 22 августа 2014

/ * WinDump.cpp * /

#ifdef WIN32

#include <windows.h>
#include <Dbghelp.h>
#include <tchar.h>


typedef BOOL (WINAPI *MINIDUMPWRITEDUMP)(HANDLE hProcess, DWORD dwPid, HANDLE hFile, MINIDUMP_TYPE DumpType,CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam);

void create_minidump(struct _EXCEPTION_POINTERS* apExceptionInfo)
{
    HMODULE mhLib = ::LoadLibrary(_T("dbghelp.dll"));
    MINIDUMPWRITEDUMP pDump = (MINIDUMPWRITEDUMP)::GetProcAddress(mhLib, "MiniDumpWriteDump");

    HANDLE  hFile = ::CreateFile(_T("core.dmp"), GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS,
        FILE_ATTRIBUTE_NORMAL, NULL);

    _MINIDUMP_EXCEPTION_INFORMATION ExInfo;
    ExInfo.ThreadId = ::GetCurrentThreadId();
    ExInfo.ExceptionPointers = apExceptionInfo;
    ExInfo.ClientPointers = FALSE;

    pDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &ExInfo, NULL, NULL);
    ::CloseHandle(hFile);
}

LONG WINAPI unhandled_handler(struct _EXCEPTION_POINTERS* apExceptionInfo)
{
    create_minidump(apExceptionInfo);
    return EXCEPTION_CONTINUE_SEARCH;
}

#endif // WIN32

/ * WinDump.h * /

#ifdef WIN32

LONG WINAPI unhandled_handler(struct _EXCEPTION_POINTERS* apExceptionInfo);

#endif // WIN32

/ * main.cpp * /

#include "WinDump.h"

int main(int argc, char **argv)
{

    // Create a dump file whenever the gateway crashes only on windows
    SetUnhandledExceptionFilter(unhandled_handler);
    return 0;
}
...