生成dmp的程序
#include聽聽
#pragma聽comment(lib,聽 "dbghelp.lib")
//设置异常处理回调函数
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;
}
2、调试dump文件
1)用windbg。
2)用vc,把dmp文件和exe, pdb文件放在同一目录下, 然后用编译器(如vc)打开, 然后开始调试就会中断到刚才中断的地方.
3、以下是网上搜集到的条件,尚未验证是否是必需的,如果不能正确的生成dmp,可尝试以下方法
1)SetUnhandledExceptionFilter()并不能处理所有的异常,比如CRT异常需要调用_set_invalid_parameter_handler()才行
1)要设置c运行库异常处理函授。这样当出错后,会引发你的异常处理,你的处理中,可以直接丢掉或重新启动你的exe,或写入log文件。
2)注意生成的release应用程序需要开启“生成调试信息”选项。
2)使用VS2008的话,不需要开启“生成调试信息”选项就可以生成的。
3)编译release版本的时候同时生成map文件,具体可以在网上查找一下关于map文件的使用方法。
3)生成可执行文件时在工程属性设置里的“调试”选项里将“生成映射文件”设置为“是”。这主要是用来在出错时通过dump和map文件对错误定位。
4、其他工具
1)生成dump文件需要Dr.Watson,它是Windows自带的调试工具,只要对它进行了设置,程序出错后就可以在相应目录下找到dump文件。可参见如下资料:http://hi.baidu.com/mryongzhang/blog/item/11a774edf9b513d72e2e2167.html
2)adplus是最有用的工具,
下载仅供下载体验和测试学习,不得商用和正当使用。
下载体验