自己封装的未捕获异常类(ZUnhandleException.h)
#ifndef _ZUNHANDLEEXCEPTION_H
#define _ZUNHANDLEEXCEPTION_H
#include <boost/noncopyable.hpp>
#include <Windows.h>
#include "DbgHelp.h"
#include <iostream>
#pragma comment(lib,"DbgHelp.lib")
class ZUnhandleException:public boost::noncopyable
{
public:
static ZUnhandleException* singleton(){
static ZUnhandleException singleton;
return &singleton;
}
static void dump(_EXCEPTION_POINTERS *exceptionInfo = NULL)
{
assert(exceptionInfo);
//创建 Dump 文件
HANDLE hDumpFile = CreateFile(L"windbg.dmp", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hDumpFile != INVALID_HANDLE_VALUE){
//Dump信息
MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
dumpInfo.ExceptionPointers = exceptionInfo;
dumpInfo.ThreadId = GetCurrentThreadId();
dumpInfo.ClientPointers = TRUE;
//写入Dump文件内容
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);
}
}
protected:
ZUnhandleException(){
SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)unhandleExceptionFilter);
}
static LONG unhandleExceptionFilter(_EXCEPTION_POINTERS *exceptionInfo){
PEXCEPTION_RECORD record = exceptionInfo->ExceptionRecord;
std::cerr << "应用程序出现未处理异常,异常代码:" << record->ExceptionCode << ",异常地址:" << record->ExceptionAddress << std::endl;
dump(exceptionInfo);
return EXCEPTION_EXECUTE_HANDLER;
}
};
#endif //_ZUNHANDLEEXCEPTION_H
使用方法:
ZUnhandleException::singleton();//在程序最早的代码执行初使用