windows程序崩溃时自动生成dump文件方法

/****************第一步添加createdump.h*********************************

添加一个头文件:createdump.h

#pragma once

#include <windows.h>
#include <imagehlp.h>
#include <stdlib.h>
#pragma comment(lib, "dbghelp.lib")

inline BOOL IsDataSectionNeeded(const WCHAR* pModuleName)
{
    if (pModuleName == 0)
    {
        return FALSE;
    }
    WCHAR szFileName[_MAX_FNAME] = L"";
    _wsplitpath(pModuleName, NULL, NULL, szFileName, NULL);
    if (wcsicmp(szFileName, L"ntdll") == 0)
    {
        return TRUE;
    }
    return FALSE;
}

inline BOOL CALLBACK MiniDumpCallback(PVOID pParam, const PMINIDUMP_CALLBACK_INPUT   pInput, PMINIDUMP_CALLBACK_OUTPUT    pOutput)
{
    if (pInput == 0 || pOutput == 0)
        return FALSE;

    switch (pInput->CallbackType)
    {
    case ModuleCallback:

        if (pOutput->ModuleWriteFlags & ModuleWriteDataSeg)
            if (!IsDataSectionNeeded(pInput->Module.FullPath))
                pOutput->ModuleWriteFlags &= (~ModuleWriteDataSeg);

    case IncludeModuleCallback:

    case IncludeThreadCallback:

    case ThreadCallback:

    case ThreadExCallback:

        return TRUE;

    default:;

    }

    return FALSE;
}

inline void CreateMiniDump(EXCEPTION_POINTERS* pep, LPCTSTR strFileName)
{
    HANDLE hFile = CreateFile(strFileName, GENERIC_READ | GENERIC_WRITE,0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

    if ((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE))
    {
        MINIDUMP_EXCEPTION_INFORMATION mdei;
        mdei.ThreadId = GetCurrentThreadId();
        mdei.ExceptionPointers = pep;
        mdei.ClientPointers = FALSE;
        MINIDUMP_CALLBACK_INFORMATION mci;
        mci.CallbackRoutine = (MINIDUMP_CALLBACK_ROUTINE)MiniDumpCallback;
        mci.CallbackParam = 0;

        MINIDUMP_TYPE mdt = (MINIDUMP_TYPE)(MiniDumpWithPrivateReadWriteMemory |MiniDumpWithDataSegs |MiniDumpWithHandleData |0x00000800 /*MiniDumpWithFullMemoryInfo*/ |0x00001000 /*MiniDumpWithThreadInfo*/ |MiniDumpWithUnloadedModules);

        MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),hFile, mdt, (pep != 0) ? &mdei : 0, 0, &mci);
        CloseHandle(hFile);
    }
}

/***************第二步*************************************

在main 函数的文件中加入

#include <windows.h>
#include "createdump.h"


LONG WINAPI GPTUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo)
{
    CreateMiniDump(pExceptionInfo, L"Exception.dmp");
    exit(pExceptionInfo->ExceptionRecord->ExceptionCode);
    return EXCEPTION_EXECUTE_HANDLER;    // 程序停止运行
}

/***************第三步*************************************

在main函数中 加入:

SetUnhandledExceptionFilter(GPTUnhandledExceptionFilter);

猜你喜欢

转载自blog.csdn.net/hlday6/article/details/84646604