1. 为了在崩溃时能生成dump文件,需要将"DbgHelp.Lib/DbgHelp.h/DbgHelp.dll"拷贝到工程目录并把DbgHelp.h加到工程中。
#include "Dbghelp.h"
#pragma auto_inline (off)
#pragma comment( lib, "DbgHelp" )
2. 定义自己的异常处理回调函数
LONG WINAPI MyUnhandledExceptionFilter(struct _EXCEPTION_POINTERS* ExceptionInfo)
{
HANDLE lhDumpFile = CreateFile(_T("CommSvr.dmp"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL ,NULL);
MINIDUMP_EXCEPTION_INFORMATION loExceptionInfo;
loExceptionInfo.ExceptionPointers = ExceptionInfo;
loExceptionInfo.ThreadId = GetCurrentThreadId();
loExceptionInfo.ClientPointers = TRUE;
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),lhDumpFile, MiniDumpNormal, &loExceptionInfo, NULL, NULL);
CloseHandle(lhDumpFile);
return EXCEPTION_EXECUTE_HANDLER;
<pre name="code" class="cpp"> //EXCEPTION_EXECUTE_HANDLER equ 1 表示我已经处理了异常,可以优雅地结束了
//EXCEPTION_CONTINUE_SEARCH equ 0 表示我不处理,其他人来吧,于是windows调用默认的处理程序显示一个错误框,并结束
//EXCEPTION_CONTINUE_EXECUTION equ -1 表示错误已经被修复,请从异常发生处继续执行
}
3.在InitInstance的开始处调用,(不一定最开始处,但尽量往前放)
SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
// 这个方式在dll中没有意义,因为屏蔽不了dll调用者的错误框,也产生不了dump文件
另外加上这句,要不框还是弹
SetErrorMode(SEM_NOALIGNMENTFAULTEXCEPT | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
4.如何分析生成的dump文件
通常在荡机的瞬间,操作系统会形成一个存储器转储文件。 这个文件是当计算机死机的瞬间的内存的映像.该文件通常放置在系统目录下的minidum目录下.例如 C:/WINDOWS/Minidump/Mini082106-01.dmp. 所以对该文件的分析就能很快查找到问题的所在. 这个文件打开看看将发现是一堆乱码.怎么分析该文件呢.通常我们使用 microsoft 提供的 WinDbg 工具来分析.这个工具可以从网站上下载得到.:dbg_x86_6.7.05.0.exe
当安装这个工具后,则就可以使用 WinDbg 来对 mimidump文件进行分析了.打开WinDbg ,首先要设置符号文件路径.符号文件是用来分析错误原因位置信息的文件.这个文件可以从 的网站随着WinDbg 一起下载,当然了比较大了.如果你不愿意下载,则可以设置连接到网站上的地址就可以了.我通常采用这种方法.
设置符号文件的地址: 在WinDbg 的菜单中: File--> Symbol File Path 中,设置 :
SRV*DownstreamStore*http://msdl.microsoft.com/download/symbols ,
然后就可以打开 minidump文件进行分析了 . File--> Open Crash Dump , ,例如打开 C:/WINDOWS/Minidump/Mini082106-01.dmp .等待一会,根据前面设置的符号文件的地址,windbg 连接到 microsoft 的网站,得到符号信息.
这个时候 在WinDbg 下面的命令行运行: !analyze -v 将得到详细的信息.