1. 包含头文件和库文件
#include 《dbghelp.h》
#include 《strsafe.h》
#pragma comment( lib, "Dbghelp.lib" )
2. 处理异常崩溃的代码,需要是全局的。
EXCEPTION_EXECUTE_HANDLER equ 1 表示我已经处理了异常,可以优雅地结束了
EXCEPTION_CONTINUE_SEARCH equ 0 表示我不处理,其他人来吧,于是windows调用默认的处理程序显示一个错误框,并结束
EXCEPTION_CONTINUE_EXECUTION equ -1 表示错误已经被修复,请从异常发生处继续执行
1. long __stdcall GenerateDump(EXCEPTION_POINTERS* pExceptionPointers)
2. {
3. BOOL bMiniDumpSuccessful;
4. WCHAR szPath[MAX_PATH];
5. WCHAR szFileName[MAX_PATH];
6. WCHAR* szAppName = L"StationMonitor";
7. WCHAR* szVersion = L"v2.1.5";
8. DWORD dwBufferSize = MAX_PATH;
9. HANDLE hDumpFile;
10. SYSTEMTIME stLocalTime;
11. MINIDUMP_EXCEPTION_INFORMATION ExpParam;
12.
13. GetLocalTime( &stLocalTime );
14. GetTempPath( dwBufferSize, szPath );
15.
16. StringCchPrintf( szFileName, MAX_PATH, L"%s%s", szPath, szAppName );
17. CreateDirectory( szFileName, NULL );
18.
19. StringCchPrintf( szFileName, MAX_PATH, L"%s%s\\%s-ddd-ddd-%ld-%ld.dmp",
20. szPath, szAppName, szVersion,
21. stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay,
22. stLocalTime.wHour, stLocalTime.wMinute, stLocalTime.wSecond,
23. GetCurrentProcessId(), GetCurrentThreadId());
24. hDumpFile = CreateFile(szFileName, GENERIC_READ|GENERIC_WRITE,
25. FILE_SHARE_WRITE|FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0);
26.
27. ExpParam.ThreadId = GetCurrentThreadId();
28. ExpParam.ExceptionPointers = pExceptionPointers;
29. ExpParam.ClientPointers = TRUE;
30.
31. bMiniDumpSuccessful = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),
32. hDumpFile, MiniDumpWithDataSegs, &ExpParam, NULL, NULL);
33.
34. return EXCEPTION_EXECUTE_HANDLER;
35.}
3. 设置捕获异常的处理函数
SetUnhandledExceptionFilter(GenerateDump);
4. 配置工程信息
右键项目名称/属性/C/C++/调试信息格式,设置为程序数据库(/Zi);
链接器/调试/生成调试信息 设置为Yes
链接器/优化/引用 设置为是(/OPT:REF),启用COMDAT折叠 设置为 是(/OPT:ICF)
5. 异常调试
将同一源码版本的*.exe、*.pdb、*.dmp,放在源码的同一个目录下,双击dmp文件,打开VS2010,点击页面上的调试功能,即可定位到故障行代码。
最方便的方式是,将生成的dmp文件,拷贝到源码中Release或者Debug(源码中生成exe为文件夹)。
参考文档:
1. https://www.cnblogs.com/lisuyun/p/5245609.html
2. https://msdn.microsoft.com/en-us/library/windows/desktop/ee416349(v=vs.85).aspx#writing_a_minidump