先调用SetUnhandledExceptionFilter()设置异常处理函数,这样在发生未处理的异常时系统就会调用你设置的异常处理函数,再在你的异常处理函数里调用MiniDumpWriteDump()生成dmp文件就可以了,就两个函数而已,函数用法请查看MSDN。
(PS:SetUnhandledExceptionFilter()并不能处理所有的异常,比如CRT异常需要调用_set_invalid_parameter_handler()才行。)
//设置异常处理回调函数
SetUnhandledExceptionFilter(UnhandledExceptionFilter);
//异常处理代码
//EXCEPTION_EXECUTE_HANDLER equ 1 表示我已经处理了异常,可以优雅地结束了
//EXCEPTION_CONTINUE_SEARCH equ 0 表示我不处理,其他人来吧,于是windows调用默认的处理程序显示一个错误框,并结束
//EXCEPTION_CONTINUE_EXECUTION equ -1 表示错误已经被修复,请从异常发生处继续执行
LONG
UnhandledExceptionFilter(
struct
_EXCEPTION_POINTERS
* ExceptionInfo)
{
CString strDumpFile;
strDumpFile.Format(
"%d"
,CTime::GetCurrentTime().GetTickCount());
strDumpFile +=
".dmp "
;
HANDLE
hFile = CreateFile(strDumpFile, GENERIC_WRITE, FILE_SHARE_WRITE,
NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL );
if
(hFile!=INVALID_HANDLE_VALUE)
{
MINIDUMP_EXCEPTION_INFORMATION ExInfo;
ExInfo.ThreadId = ::GetCurrentThreadId();
ExInfo.ExceptionPointers = ExceptionInfo;
ExInfo.ClientPointers = NULL;
// write the dump
BOOL
bOK = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &ExInfo, NULL, NULL );
CloseHandle(hFile);
}
theApp.PostThreadMessage(WM_QUIT,0,0);
return
EXCEPTION_EXECUTE_HANDLER;
}