在主程序初始化时加入
DeclareDumpFile();
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | 创建头文件DumpFile.h, 将下列代码放进文件中 #pragma once #include <windows.h> #include < Dbghelp.h> #include <iostream>   #include <vector>   using namespace std;  #pragma comment(lib, "Dbghelp.lib") namespace NSDumpFile {      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();     } }; #define DeclareDumpFile() NSDumpFile::RunCrashHandler(); | 
发表评论
要发表评论,您必须先登录。