1. 如何生成dump文件?
原理:通過SetUnhandledExceptionFilter設置捕獲dump的入口,然后通過MiniDumpWriteDump生成dump文件;
SetUnhandledExceptionFilter:
https://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=EN-US&k=k(SETUNHANDLEDEXCEPTIONFILTER);k(DevLang-%22C%2B%2B%22)&rd=true
MiniDumpWriteDump:
https://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=EN-US&k=k(MINIDUMPWRITEDUMP);k(DevLang-%22C%2B%2B%22)&rd=true
示例:
1 #ifndef _DUMP_GENERATE_H_ 2 #define _DUMP_GENERATE_H_ 3 4 #include <Windows.h> 5 #include <DbgHelp.h> 6 #pragma comment(lib, "DbgHelp.lib") 7 8 LONG WINAPI MyUnhandledExceptionFilter(_In_ struct _EXCEPTION_POINTERS *ExceptionInfo); 9 void MyDumpGenerate(); 10 11 void MyDumpGenerate() 12 { 13 SetUnhandledExceptionFilter(MyUnhandledExceptionFilter); 14 } 15 16 LONG WINAPI MyUnhandledExceptionFilter(_In_ struct _EXCEPTION_POINTERS *ExceptionInfo) 17 { 18 MessageBox(0,L"DumpGenerate",0,0); 19 20 HANDLE lhDumpFile = CreateFile(L"D:\\test.dmp", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL); 21 22 MINIDUMP_EXCEPTION_INFORMATION loExceptionInfo; 23 loExceptionInfo.ExceptionPointers = ExceptionInfo; 24 loExceptionInfo.ThreadId = GetCurrentThreadId(); 25 loExceptionInfo.ClientPointers = TRUE; 26 MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), lhDumpFile, MiniDumpNormal, &loExceptionInfo, NULL, NULL); 27 28 CloseHandle(lhDumpFile); 29 30 /* 31 * EXCEPTION_CONTINUE_SEARCH:將異常傳給調試器 32 * EXCEPTION_EXECUTE_HANDLER:不顯示錯誤信息 33 */ 34 return EXCEPTION_EXECUTE_HANDLER; 35 } 36 37 #endif // _DUMP_GENERATE_H_ 38 39 //////////////// 40 // main.cpp 41 int main() 42 { 43 MyDumpGenerate(); 44 int* p = NULL; 45 *p = 1; 46 // 這里異常后,會自動調用MyUnhandledExceptionFilter接口,生成dump文件:test.dmp。 47 return 0; 48 }
2. 如何使用WinDbg調試dump文件,以test.dmp為例:
2.1 准備步驟:
2.1.1 設置pdb文件路徑:



2.1.2 設置源文件路徑:


2.1.3 導入/拖入test.dmp文件;
2.2 通過命令(.reload -> ! analyze -v)來分析dump,然后可以定位到如下錯誤:
http://www.cnblogs.com/ahuo/archive/2010/05/19/1739053.html(此文轉載,感謝作者的無私奉獻)


3. 使用WinDbg調試程序:
待續...