c++ windows程序崩溃生成转储dump

来源:互联网 发布:极乐净土相机数据 编辑:程序博客网 时间:2024/05/16 05:09


CrashDump.h


#pragma once#include <windows.h>#include < Dbghelp.h>#include <tchar.h>  void CreateDumpFile(LPCWSTR lpstrDumpFilePathName, EXCEPTION_POINTERS *pException);LPTOP_LEVEL_EXCEPTION_FILTER WINAPI MyDummySetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter);BOOL PreventSetUnhandledExceptionFilter();LONG WINAPI UnhandledExceptionFilterEx(struct _EXCEPTION_POINTERS *pException);void RunCrashHandler();

CrashDump.h

#include "CrashDump.h"#pragma comment(lib, "Dbghelp.lib")void CreateDumpFile(LPCWSTR lpstrDumpFilePathName, EXCEPTION_POINTERS *pException){    // 创建Dump文件      //      HANDLE hDumpFile = CreateFile(lpstrDumpFilePathName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);    // Dump信息      //      MINIDUMP_EXCEPTION_INFORMATION dumpInfo;    dumpInfo.ExceptionPointers = pException;    dumpInfo.ThreadId = GetCurrentThreadId();    dumpInfo.ClientPointers = TRUE;    // 写入Dump文件内容      //      MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);    CloseHandle(hDumpFile);}LPTOP_LEVEL_EXCEPTION_FILTER WINAPI MyDummySetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter){    return NULL;}BOOL PreventSetUnhandledExceptionFilter(){    HMODULE hKernel32 = LoadLibrary(_T("kernel32.dll"));    if (hKernel32 == NULL)        return FALSE;    void *pOrgEntry = GetProcAddress(hKernel32, "SetUnhandledExceptionFilter");    if (pOrgEntry == NULL)        return FALSE;    unsigned char newJump[100];    DWORD dwOrgEntryAddr = (DWORD)pOrgEntry;    dwOrgEntryAddr += 5; // add 5 for 5 op-codes for jmp far    void *pNewFunc = &MyDummySetUnhandledExceptionFilter;    DWORD dwNewEntryAddr = (DWORD)pNewFunc;    DWORD dwRelativeAddr = dwNewEntryAddr - dwOrgEntryAddr;    newJump[0] = 0xE9;  // JMP absolute    memcpy(&newJump[1], &dwRelativeAddr, sizeof(pNewFunc));    SIZE_T bytesWritten;    BOOL bRet = WriteProcessMemory(GetCurrentProcess(), pOrgEntry, newJump, sizeof(pNewFunc) + 1, &bytesWritten);    return bRet;}LONG WINAPI UnhandledExceptionFilterEx(struct _EXCEPTION_POINTERS *pException){    TCHAR szMbsFile[MAX_PATH] = { 0 };    ::GetModuleFileName(NULL, szMbsFile, MAX_PATH);    TCHAR* pFind = _tcsrchr(szMbsFile, '\\');    if (pFind)    {        *(pFind + 1) = 0;        _tcscat(szMbsFile, _T("CrashDumpFile.dmp"));        CreateDumpFile(szMbsFile, pException);    }    // TODO: MiniDumpWriteDump    FatalAppExit(-1, _T("Fatal Error"));    return EXCEPTION_CONTINUE_SEARCH;}void RunCrashHandler(){    SetUnhandledExceptionFilter(UnhandledExceptionFilterEx);    PreventSetUnhandledExceptionFilter();}

网上找的,连接忘记了






0 0