屏蔽runtime error等错误的弹出框

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 将得到详细的信息.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值