当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

使用SetUnhandledExceptionFilter让程序优雅的崩溃

发表于: 2014-03-19   作者:aigo   来源:转载   浏览次数:
摘要: 原文:http://blog.csdn.net/zhengguodun/article/details/5483203 虽然是大公司的产品,QQ它还是会在我们的折腾下崩溃的,但是它总是崩溃的很优雅,还要弹出自己的对话框来结束。并且发送报告,去掉了系统默认的发送报告的对话框。 所以一拍脑袋,想让自己的程序崩溃的体面一点。 自己想了大概的思路,觉得可以用一个进程来监控目标程序。的确也可以拿到了目

原文:http://blog.csdn.net/zhengguodun/article/details/5483203

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

所以一拍脑袋,想让自己的程序崩溃的体面一点。

自己想了大概的思路,觉得可以用一个进程来监控目标程序。的确也可以拿到了目标程序崩溃的信息,知道它什么时候崩溃的,也可以做额外的操作,但是这样是没办法把默认的发送错误的对话框去掉的。

然后又有人说是不是采用了类似钩子的方法把这个东西在哪里勾掉了。

最后网上查了一番,发现SetUnhandledExceptionFilter这个函数解决了一切。

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

 

EXCEPTION_EXECUTE_HANDLER equ 1 表示我已经处理了异常,可以优雅地结束了  

EXCEPTION_CONTINUE_SEARCH equ 0 表示我不处理,其他人来吧,于是windows调用默认的处理程序显示一个错误框,并结束  

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下一试,竟然可以o(∩_∩)o...

并且我是在一个MDI程序下的一个DLL中发生的一个异常,竟然也掉近了回调函数,心理暗爽啊。

然后又在一个出错的控件中试了一下,竟然控件的错误也能捕获到。怎一爽字了得!

 

本文参考了如下两文章,红色部分为引用如下文章:

http://www.anqn.com/jiamijiemi/xitongdiceng/2007-09-27/a0987174.shtml

 

http://topic.csdn.net/t/20040727/13/3214397.html

 

SetUnhandledExceptionFilter在debug模式下不会生效,原因如下:

http://support.microsoft.com/kb/173652

 

使用SetUnhandledExceptionFilter让程序优雅的崩溃

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
关于程序崩溃时转储内存DMP,可以设置注册表,使程序崩溃时自动转储内存DMP,见程序崩溃时利用注册
(逼格是不是蹭蹭蹭连升了好几个档次? 1. 最好不要拿 Macbook 装 windows,即使必须要用 windows
主要内容: 记录ex的 $_ 记录现任的 $0 简洁的 $(selector) 和 $$(selector) 拷贝Object的 copy(Obj
前言 phantomjs中文问题 phantomjs中文问题 [后续] 优化字体的显示 使用Chrome OS字体来代替serif,
本人长期使用安卓,也短期使用过itouch4,说说个人经验. 首先在 设备选择上,建议尽量选择Google的亲儿
转自 http://blog.csdn.net/starlee/article/details/6630816 让程序在崩溃时体面的退出之SEH SEH的
只需要在软件中嵌入3行代码,就可以追踪自己的软件有多少人下载,每天有多少次启动,为什么崩溃了?
Windbg抓取程序崩溃的dmp文件的方法 一、 简介 windbg是在windows平台下,强大的用户态和内核态调试
操作系统:Ubuntu10.04 前言: 在程序崩溃后,如何快速定位问题。 以下方法适用于开发调试阶段,不
1. 写个测试代码 #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { int a,b; a=1; b=0;
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号