需要头文件:#include <DbgHelp.h>和库DbgHelp.lib
首先定义一个默认的异常处理回调函数:
LONG CrashHandler(struct _EXCEPTION_POINTERS* pExceptionInfo)
{
std::string dumpFileName = "./CrashDump.dump";
HANDLE hDumpFile = CreateFile(lpstrDumpFilePathName, GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
// Get Dump Info
MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
dumpInfo.ExceptionPointers = pExceptionInfo;
dumpInfo.ThreadId = GetCurrentThreadId();
dumpInfo.ClientPointers = TRUE;
// Write Dump
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile,
MiniDumpNormal, &dumpInfo, NULL, NULL);
CloseHandle(hDumpFile);
return EXCEPTION_EXECUTE_HANDLER;
}
然后在程序一开始调用API函数来设置这个回调,这样当程序异常崩溃的时候就会在当前目录生成CrashDump.dump文件,方便调试跟踪:
SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)CrashHandler);
---------------------------------------
实际使用:
LONG CrashHandler(struct _EXCEPTION_POINTERS* pExceptionInfo)
{
std::string dumpFileName = "./CrashDump.dump";
HANDLE hDumpFile = CreateFile(L"./CrashDump.dump", GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
// Get Dump Info
MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
dumpInfo.ExceptionPointers = pExceptionInfo;
dumpInfo.ThreadId = GetCurrentThreadId();
dumpInfo.ClientPointers = TRUE;
// Write Dump
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile,
MiniDumpNormal, &dumpInfo, NULL, NULL);
CloseHandle(hDumpFile);
return EXCEPTION_EXECUTE_HANDLER;
}
int main(int argc, char *argv[])
{
SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)CrashHandler);
//... app.run();
return 0;
}