`
aigo
  • 浏览: 2675819 次
  • 性别: 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

 

分享到:
评论

相关推荐

    vc实现程序崩溃时弹出个自定义的对话框.仿QQ崩溃了会出一个对话框提示程序错误bug上报

    为了提高用户体验并收集有用的调试信息,开发者可以自定义在程序崩溃时显示的错误报告对话框,而不是让系统默认的错误对话框出现。Visual C++ 提供了一种方法来实现这一功能,类似于QQ程序在发生错误时弹出的定制...

    using SetUnhandledExceptionFilter for release

    在Windows操作系统中,开发者可以使用`SetUnhandledExceptionFilter`函数来增强程序的异常处理能力,特别是在发布版本(release模式)中,该功能显得尤为重要。本文将深入探讨`SetUnhandledExceptionFilter`函数的...

    如何利用WinDbg找出程序崩溃的位置

    如何利用WinDbg找出程序崩溃的位置 WinDbg是一款功能强大的调试工具,可以帮助开发者快速定位程序崩溃的位置。下面我们将详细介绍如何利用WinDbg找出程序崩溃的位置。 一、准备工作 在开始之前,我们需要准备以下...

    VC 记录程序崩溃堆栈

    2. **使用调试器**:Visual Studio 自带的调试器(如 Visual Studio Debugger 或 WinDbg)可以在程序崩溃时自动捕获堆栈信息。在调试模式下运行程序,当发生崩溃时,调试器会暂停执行并显示当前的堆栈跟踪。 3. **...

    自动获取程序崩溃的dump文件类

    在IT行业中,尤其是在软件开发领域,程序崩溃是一个常见的问题,它可能会导致数据丢失或用户体验下降。为了解决这类问题,我们需要有效地捕获和分析崩溃时的程序状态,这就是dump文件的作用。dump文件记录了程序运行...

    vs2010如何修改工程使得应用程序崩溃自动生成dump文件

    ### 如何在VS2010中配置程序以在崩溃时自动创建DUMP文件 本文档将详细介绍如何在Visual Studio 2010 (VS2010)中配置一个项目,使其能够在程序崩溃时自动生成DUMP文件,并提供一些基本的DUMP文件分析方法。 #### 一...

    SetUnhandledExceptionFilter+Mini-dump smtp 发送邮件

    调试Relese 程序崩溃的神器, 使用 SetUnhandledExceptionFilter 接口生成 Mini-dump文件, 再将生成的dmp文件发送给目标邮件, 分别使用C/C++两种方式解决问题, 邮件使用smtp协议, 支持代理功能, 用QQ邮箱测试正常.

    Qt mingw release版异常结束 crash信息捕捉和跟踪(含测试代码)

    程序在debug可以正常运行,但是在release版后异常结束,系统又没有提供任何信息情况下,或者程序发布后在客户手中出现异常崩溃,但自己测试又不能复现问题,要是能捕获到异常时相关信息就很好定位问题了。...

    SetUnhandledExceptionFilter和C / C ++运行时库

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

    SetUnhandledExceptionFilter的c++代码

    SetUnhandledExceptionFilter的c++代码

    crashdump:进程外崩溃转储的示例

    启动时,dumper使用其命令行中的进程和线程ID打开崩溃程序的句柄。 然后,它使用对ReadProcessMemory的一些调用来获取转储程序的异常指针和上下文记录。 然后,它将使用此上下文记录来设置原始堆栈帧,并开始使用...

    vc 生成崩溃文件

    在开发Windows应用程序时,有时我们需要对程序的崩溃情况进行调试,以便找出问题的根源。"vc 生成崩溃文件" 是一种技术,它允许我们在程序异常终止时自动创建一个内存转储(dump)文件。这个文件包含了程序崩溃时的...

    第22章-OllyDbg反调试之UnhandledExceptionFilter,ZwQueryInformationProce

    当我们在OllyDbg中加载目标程序(如CrackMe),并确保所有异常都被忽略,我们会注意到,如果没有使用OllyDbg,程序在遇到异常时不会关闭。相反,如果使用OllyDbg,程序会因为检测到调试器的存在而关闭。这表明,程序...

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

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

    c++ 生成dump文件小程序

    3. **处理异常**:为了在程序崩溃时自动生成dump文件,可以使用`SetUnhandledExceptionFilter`函数设置一个全局的异常处理器。在这个处理器中,调用`GenerateDump`函数,传入当前进程和线程信息。 4. **分析dump...

    Qt工程生成MiniDump文件

    在Qt开发过程中,有时我们需要对程序崩溃或者异常情况进行调试,这时生成MiniDump文件就显得尤为重要。MiniDump文件包含了进程在特定时刻的内存快照,它包含堆栈信息、线程状态以及一部分进程内存,这对于定位问题...

    window COREdump文件生成 c++代码

    在Windows操作系统上,生成Coredump文件对于调试和分析C++程序崩溃原因至关重要。Coredump文件包含了程序崩溃时内存中的关键信息,如进程的内存映射、全局变量、堆栈信息等,使得开发者能够定位到问题的具体位置,...

    自动捕获异常dump;替换windbg;替换SetUnhandledExceptionFilter

    在win7系统下,通过SetUnhandledExceptionFilter...但在win8、win10系统SetUnhandledExceptionFilter(即使hook)也已经无法捕获一些特殊的异常,因此使用注册表的aedebug是最通用的方法;该工具简化的dump获取的方式

    关于一些调试器的反调试技术

    4. RDTSC/ GetTickCount时间敏感程序段 7 5. StartupInfo结构 7 6. BeingDebugged 8 7. PEB.NtGlobalFlag , Heap.HeapFlags, Heap.ForceFlags 10 8. DebugPort: CheckRemoteDebuggerPresent()/...

    Win32CrashHandler.zip

    在Windows编程环境中,Win32 API是开发桌面应用程序的基础,它提供了一系列的函数接口供开发者使用。本项目"Win32CrashHandler.zip"聚焦于Win32应用程序崩溃时的异常处理,帮助开发者捕获并记录程序错误,以便进行...

Global site tag (gtag.js) - Google Analytics