使用SetUnhandledExceptionFilter()让程序优雅的崩溃

使用SetUnhandledExceptionFilter()让程序优雅的崩溃

虽然是大公司产品,QQ还是会在我们的折腾下崩溃,但是它总是崩溃的很优雅,还要弹出自己的对话框来结束。并且发送报告,去掉了系统默认的发送报告的对话框。

想让自己的程序崩溃的体面一点,觉得可以用一个进程来监控目标程序。的确也可以拿到了目标程序崩溃的信息,知道它什么时候崩溃的,也可以做额外的操作,但是这样是没办法把默认的发送错误的对话框去掉的。然后又有人说是不是采用了类似钩子的方法把这个东西在哪里勾掉了。最后网上查了一番,发现SetUnhandledExceptionFilter这个函数解决了一切。

总结了下搜到的资料,这个函数的返回值有三种情况:

  1. EXCEPTION_EXECUTE_HANDLER equ 1:表示我已经处理了异常,可以优雅地结束了。
  2. EXCEPTION_CONTINUE_SEARCH equ 0:表示我不处理,其他人来吧,于是windows调用默认的处理程序显示一个错误框,并结束。
  3. EXCEPTION_CONTINUE_EXECUTION equ -1:表示错误已经被修复,请从异常发生处继续执行。

具体使用方法如下:

 #include   <windows.h>  

   

  long   __stdcall   callback(_EXCEPTION_POINTERS*   excp)  

  {  

  MessageBox(0,"Error","error",MB_OK);  

  printf("Error   address   %x/n",excp->ExceptionRecord->ExceptionAddress);  

  printf("CPU   register:/n");  

  printf("eax   %x   ebx   %x   ecx   %x   edx   %x/n",excp->ContextRecord->Eax,  

  excp->ContextRecord->Ebx,excp->ContextRecord->Ecx,  

  excp->ContextRecord->Edx);  

  return   EXCEPTION_EXECUTE_HANDLER;  

  }

   

  int   main(int   argc,char*   argv[])  

  {  

  SetUnhandledExceptionFilter(callback);  

  _asm   int   3   //只是为了让程序崩溃

  return   0;  

  }

成功以后,去翻了下windows核心编程,发现里面已经有提到了这个函数了。只是由于学艺不精,暂时没有去拜读这么高深的书。所以一直不知道。

问了下同事,发现他立马说出了可以用这个函数(说个大概的函数名)来实现,并且提出在win32下是可以的,但是在MFC可能捕获不到这个异常。认为MFC下有自己的一套机制来解决。后来我半信半疑,在MFC下一试,竟然可以,并且我是在一个MDI程序下的一个DLL中发生的一个异常,竟然也掉近了回调函数,心理暗爽啊。然后又在一个出错的控件中试了一下,竟然控件的错误也能捕获到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值