使用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中发生的一个异常,竟然也掉近了回调函数,心理暗爽啊。然后又在一个出错的控件中试了一下,竟然控件的错误也能捕获到。

使用SetUnhandledExceptionFilter()让程序优雅的崩溃相关推荐

  1. qt5.9.0 msvc2015优雅的崩溃:dumpfile

    交给客户的软件奔溃了怎么办? 我们不能再客户电脑上安装vs,也不想傻傻的用log来猜测出错的地方. 利用Dbghelp可以解决这一问题. 首先是vs生成release版本的时候需要同时生成pdb文件, ...

  2. 【iOS】iOS 调试快速定位程序在哪崩溃

    iOS 开发过程中经常遇到程序崩溃.快速定位程序在哪崩溃的步骤如下: 1. 2. 3. 这样设置后,程序崩溃时会定位到崩溃的语句,如下: 原文链接:iOS开发何如在调试的时候轻松找到程序在哪里崩溃 转 ...

  3. 配置win2003 server IIS的总结,为什么IIs的工作进程会在空闲时间释放的问题。同时学会了throw的真正含义,throw的真正含义就是导致程序停止,崩溃,很简单,网摘也有记录。...

    项目背景:242后期,别人写的代码出现问题,我测试中发现的. 当时在内存中设立了一个队列,用arrylist存放任务队列,但是经过一段时间后,发现队列中信息没有了,还以为是出现异常的原因,最后,在网友 ...

  4. windows 设置 java 程序开机启动 + 崩溃重启

    前言 有时我们需要把写好的 java 程序部署在 Windows 系统的服务器上,如果服务器被人为重启,或者程序由于未知原因自己崩溃了,程序不能自动重启,用户体验很不好.接下来介绍一种可行的解决方案: ...

  5. C++通过基类指针delete派生类数组,析构函数是虚函数,程序为什么会崩溃? https://www.zhihu.com/question/30838092/answer/49623765

    https://www.zhihu.com/question/30838092/answer/49623765 C++通过基类指针delete派生类数组,析构函数是虚函数,程序为什么会崩溃? 代码如下 ...

  6. 如何在程序中生成崩溃转储dump文件以及如何分析dump

    关于更详细的内容,如果有兴趣,可以访问下面的视频 https://edu.csdn.net/course/detail/28915 程序崩溃的时候如何生成dump文件 话不多说,直接上代码,下面的程序 ...

  7. vc/vs开发的应用程序添加dump崩溃日志转

    原贴地址:https://blog.csdn.net/wangkui1331/article/details/78029940 vc/vs开发的应用程序出现崩溃的时候,由于没有任何记录,导致开发人员很 ...

  8. 程序运行时崩溃生成崩溃文件(Windows Linux)

    记:在实际开发过程中,程序可以通过IDE来排查崩溃问题,但是当程序部署到没有开发环境的电脑上时,为方便调试和排查问题,势必要通过崩溃文件来记录崩溃瞬间的信息,这样就可以通过查找堆栈信息来排查问题. 一 ...

  9. 程序员加班崩溃,过路外卖小哥主动帮忙改代码,网友直呼太暖了!

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 有人说,成年人的崩溃总在一瞬间. 近日,一段青岛外卖小哥帮程序员写代 ...

最新文章

  1. 20145234黄斐《java程序设计》第六周
  2. 半监督学习技术在金融文本分类上的实践
  3. 关系数据库和nosql
  4. Response.Redirect 与 异常(线程正在中止)
  5. Java程序员需要掌握的计算机底层知识(二):操作系统、内核、用户态与内核态、系统调用的执行过程
  6. 开发工具:IDEA 调试技巧,非常实用,欢迎收藏!
  7. pytorch gather_Pytorch 单机并行训练
  8. WCF 第五章 导出并发布元数据(服务行为)
  9. Python之路【第十五篇】:Web框架
  10. ubuntu之安装显卡驱动
  11. Java中的锁原理、锁优化、CAS、AQS
  12. 声明与所在行数不兼容_深度理解:Windows DLL 二进制兼容性探究
  13. python中或语句_python判断语句怎么写
  14. 用三张图理解深度学习的工作原理
  15. 软件工程之图书管理系统总体设计
  16. 微信小程序监听路由变化
  17. SVN更新操作提示需要清理操作,清理操作提示乱码,更新SVN失败【解决方案】
  18. 【Python 数据科学】分组group by基础
  19. 技术中台的作用是什么,在什么情况下才有必要做技术中台?
  20. 【数据挖掘】Python绘制一组样本的CDF概率分布函数(经验分布函数)

热门文章

  1. MySQL8.0.11的安装和Navicat连接mysql
  2. ARM指令集的最新版本包括针对JavaScript的优化
  3. Java开发知识之Java的包装类
  4. JavaScript中call、apply个人理解
  5. Linux之touch命令
  6. 汽车短视频大行其道,新能源汽车平台杉车网如何“领风骚”?
  7. Android 调试技巧之快速重启生效
  8. CentOS6.6部署VNC服务端
  9. 电子工程师名片——FAT16文件系统(转)
  10. java中length的用法