windows上使用minidump获取和调试崩溃信息
windows下使用minidump获取和调试崩溃信息
使用SetUnhandledExceptionFilter设置崩溃后的回调,然后在回调函数中使用MiniDumpWriteDump写dump文件。
非常简单和实用的功能,先上代码
1、使用minidump获取和打印崩溃信息
#include <windows.h> #include <ImageHlp.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); } LONG ApplicationCrashHandler(EXCEPTION_POINTERS *pException) { MyCreateDirectory("debug"); CreateDumpFile(L"debug/wing.dmp", pException); return EXCEPTION_EXECUTE_HANDLER; } void InitCrashReport() { SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler); }
使用SetUnhandledExceptionFilter设置崩溃后的回调,然后在回调函数中使用MiniDumpWriteDump写dump文件。
2、调试获取的dump文件
发布版本时要保留生成的pdb文件和对应代码(svn上打tag),获取到崩溃信息后,把dump文件pdb文件和代码放到一个目录,双击dump文件,vs就自动开始调试,如果完全匹配的话,就可以定位到具体崩溃行和上下文变量信息。
3、使用SEH捕获空指针等崩溃,保证程序大多数情况下稳定运行。
void mainLoop() { __try { realGameLoop(); } __exception(EXCEPTION_EXECUTE_HANDLER) { } }
- 1楼Piao_Polar昨天 01:59
- 当时转2008的时候我顺便做了这个,除了SetUnhandledExceptionFilter,还加了_set_invalid_parameter_handler,并且测试了这两者napi hook由于各种原因我没做,最大的原因你懂得。n见下文nhttp://www.cppblog.com/woaidongmao/archive/2009/10/21/99129.html?opt=admin