程序dmp文件生成

 1 #pragma once
 2 #include <windows.h>
 3 #include <imagehlp.h>
 4 #include <stdlib.h>
 5 #include <iostream>
 6 #pragma comment(lib, "dbghelp.lib")
 7 
 8 
 9 inline BOOL IsDataSectionNeeded(const WCHAR* pModuleName)
10 
11 {
12   if(pModuleName == 0)
13   {
14        return FALSE;
15   } 
16 
17   WCHAR szFileName[_MAX_FNAME] = L"";
18   _wsplitpath(pModuleName, NULL, NULL, szFileName, NULL); 
19 
20   if(wcsicmp(szFileName, L"ntdll") == 0)
21        return TRUE;
22   return FALSE; 
23 }
24 
25  
26 
27 inline BOOL CALLBACK MiniDumpCallback(PVOID   pParam,const PMINIDUMP_CALLBACK_INPUT pInput,PMINIDUMP_CALLBACK_OUTPUT  pOutput)
28 
29 {
30   if(pInput == 0 || pOutput == 0)
31        return FALSE; 
32 
33   switch(pInput->CallbackType)
34   {
35   case ModuleCallback: 
36        if(pOutput->ModuleWriteFlags & ModuleWriteDataSeg) 
37             if(!IsDataSectionNeeded(pInput->Module.FullPath)) 
38                 pOutput->ModuleWriteFlags &= (~ModuleWriteDataSeg); 
39   case IncludeModuleCallback:
40   case IncludeThreadCallback:
41   case ThreadCallback:
42   case ThreadExCallback:
43        return TRUE;
44   default:;
45   }
46   return FALSE;
47 }
48 
49  
50 
51 inline void CreateMiniDump(EXCEPTION_POINTERS* pep, LPCTSTR strFileName)
52 {
53   HANDLE hFile = CreateFile(strFileName, GENERIC_READ | GENERIC_WRITE,
54        0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 
55 
56   if((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE))
57   {
58        MINIDUMP_EXCEPTION_INFORMATION mdei;
59        mdei.ThreadId           = GetCurrentThreadId();
60        mdei.ExceptionPointers  = pep;
61        mdei.ClientPointers     = FALSE;
62        MINIDUMP_CALLBACK_INFORMATION mci;
63        mci.CallbackRoutine     = (MINIDUMP_CALLBACK_ROUTINE)MiniDumpCallback;
64        mci.CallbackParam       = 0;
65        MINIDUMP_TYPE mdt = (MINIDUMP_TYPE)(MiniDumpWithPrivateReadWriteMemory | 
66             MiniDumpWithDataSegs | 
67             MiniDumpWithHandleData |
68             0x00000800 /*MiniDumpWithFullMemoryInfo*/ | 
69             0x00001000 /*MiniDumpWithThreadInfo*/ | 
70             MiniDumpWithUnloadedModules);
71        MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),
72             hFile, mdt, (pep != 0) ? &mdei : 0, 0, &mci);
73        CloseHandle(hFile); 
74   }
75 }
新建一个头文件将上面内容粘贴到文件中
 1 std::ostream& operator<<(std::ostream& os, const EXCEPTION_RECORD& red)
 2 {
 3     return os << "   Thread ID:" << GetCurrentThreadId()
 4         << "   ExceptionCode: " << red.ExceptionCode << "\n"
 5         << "   ExceptionFlags: " << red.ExceptionFlags << "\n"
 6         << "   ExceptionAddress: " << red.ExceptionAddress << "\n"
 7         << "   NumberParameters: " << red.NumberParameters;
 8 }
 9 LONG WINAPI GPTUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo)
10 {
11     //保存现场文件
12     CreateMiniDump(pExceptionInfo, "testdmp.dmp");
13     cerr<<"未知错误:"<<(*pExceptionInfo->ExceptionRecord)<<endl;
14     exit(pExceptionInfo->ExceptionRecord->ExceptionCode);    
15     return EXCEPTION_EXECUTE_HANDLER;    // 程序停止运行
16 }

添加上面内容到cpp文件中

//注册生成dmp文件函数 此代码应放在可能出现异常代码前面
SetUnhandledExceptionFilter(GPTUnhandledExceptionFilter);

posted @ 2014-09-10 19:02  smart727  阅读(452)  评论(0编辑  收藏  举报