`
aigo
  • 浏览: 2733335 次
  • 性别: Icon_minigender_1
  • 来自: 宜昌
社区版块
存档分类
最新评论

使用SetUnhandledExceptionFilter让程序优雅的崩溃

阅读更多

原文: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和C / C ++运行时库

    通过结合使用`SetUnhandledExceptionFilter`,开发者可以增加一层保护,确保即使在最糟糕的情况下也能优雅地处理错误。 描述中提到的"修复程序"可能是指一种技术,用于在异常发生时收集调试信息,例如堆栈跟踪、...

    在vc中实现应用程序的异常截获

    异常截获是指在程序中设置特定的处理程序,以便在出现错误或异常时能够捕获并处理它们,而不是让程序崩溃。这篇文档将详细探讨如何在VC++中实现应用程序的异常截获。 首先,我们需要了解C++的异常处理基础。C++的...

    Crash异常捕获与处理

    "Crash异常捕获与处理"是一个关键领域,它涉及到如何在程序发生错误时进行适当的响应,以避免应用崩溃并提供用户友好的体验。`NSSetUncaughtExceptionHandler`是苹果提供的一个机制,用于设置一个未捕获异常的处理器...

    32汇编 — SEH1

    在Windows操作系统中,SEH(Structured Exception Handling,结构化异常处理)是一种用于处理程序异常的机制,它允许程序员优雅地管理程序错误,而不会导致程序崩溃。SEH使用了一个链表的数据结构来组织异常处理程序...

    C++异常处理之大全,包括SEH,CRT函数,打印堆栈等相关知识

    在C++编程中,异常处理是一项关键技能,它允许程序员优雅地处理运行时错误,而不会导致程序崩溃。本文将深入探讨C++异常处理的各个方面,包括结构化异常处理(SEH)、C运行时库(CRT)函数以及如何打印调用堆栈。...

    c++异常处理机制描述

    在C++中,异常处理允许程序员优雅地处理错误,而不是让程序崩溃或产生未定义的行为。这一机制允许代码在出现问题时抛出一个异常,然后在程序的其他部分捕获并处理这个异常,而不是中断正常的执行流程。 ### 异常...

    线程异常SEHHook

    1. **安装异常处理程序**:通过使用`__try`、`__except`或者`SetUnhandledExceptionFilter`等函数,程序员可以设置自定义的异常处理函数。在异常发生时,系统会按照异常处理链表顺序调用这些函数。 2. **钩子技术**...

    SecureWinApi:一些有趣的代码

    使用`SetUnhandledExceptionFilter`函数可以设置全局未处理异常处理器,从而在程序崩溃时提供一个优雅的退出机制,或记录错误信息,帮助调试。 7. 输入验证: 对用户输入进行验证是防止注入攻击的关键。WinAPI...

Global site tag (gtag.js) - Google Analytics