MFC程序崩溃的友好处理-程序员宅基地

技术标签: 操作系统  

软件总存在这样或者那样的bug。

虽然测试员已经在很努力的寻找问题,程序员也在汗流浃背的除虫,但是总会有一些情况被遗漏或者不可预测,比如用户的硬件环境、网络状况、操作系统差异等等,不一而足。而导致的结果则是弹出下面这样一个让用户摸不着头脑又恼火的提示,然后崩溃掉,令程序员尴尬不已。

image 

而在一些成熟的软件产品中,程序崩溃时我们看到的却是另外一番画面,比如QQ:

image 

又比如迅雷:

image

你也想让你的程序拥有友好的崩溃界面,降低用户生气的能量,并且收集一些必要的信息进行调试,来完善你的程序吗?如果你是MFC程序猿,请继续围观,其他猿类请自行无视,并寻找适合你的猿粪。

其实MFC框架已经为我们考虑到这个问题,只是默认生成的应用程序框架没有包含进去而已。实现这个功能的核心是函数:SetUnhandledExceptionFilter,想要了解这个函数的同学请查阅MSDN,这里就不再赘述他的用法。本着复用主意的精神,本文介绍的内容来自于大家所熟悉的电驴(emule)的源代码,电驴实现了上面那样的功能,我只是把代码从电驴里拿出来加到自己的程序里然后到这里分享给你。

毫无疑问,电驴是一款优秀的软件,并且在它华丽的外表下还有一副强壮的身体。它的代码有非常优秀。它是基于MFC开发的开源程序,需要源代码的同学请猛击这里下载。

image

上面这幅图就是电驴的源代码包,我们要用到的就是那个被我选中的“CrashReporter”,它是一个独立的工程,我们只需要根据需要做一些修改然后直接编译即可。

另外我们还需要位于src\WorkLayer\目录下的mdump.h和mdump.cpp,把这两个文件拷贝并加到你的工程里,然后把mdump.cpp里的下面这行去掉:

#include "CheckConflict.h"    //ADDED by fengwen on 2006/12/25    : 检测已知的第三方软件冲突。

这个是用于检测已知的会和电驴冲突的软件,不再本文讨论之列,有兴趣的同学请自行研究。另外把TopLevelFilter函数里的下面几行也删掉:

try
{
    //ADDED by fengwen on 2006/12/25    <begin> :    检测第三方软件冲突。
    CCheckConflict    cc;
    if (cc.CheckConflict(pExceptionInfo))
    {
        ExitProcess(1);
    }
    //ADDED by fengwen on 2006/12/25    <end> :    检测第三方软件冲突。
}
catch(...)
{
}

最后一步,在主程序框架类里添加:

#include "mdump.h"

再到InitInstance函数里添加下面的代码:

theCrashDumper.Enable(_T("YourApp 1.0"), false);

好了,大功告成,现在编译你的程序,在合适的地方增加测试代码就可以实验效果了。比如下面这两行代码会让你的程序立即崩溃:

int n = 0;
int m = 10/n;

怎么样,效果还不错吧?这个程序除了拦截进程异常,还能够将异常的相关信息生成文件,然后上传到你指定的服务器,供你分析调试。当然你需要修改CrashReporter工程HttpUploadFileProc.cpp文件HttpUploadFile函数里相关变量的值,否则就上传到到电驴的服务器了。另外你还需要在你服务器的WEB server上提供一个接收文件上传的程序,用来保存用户上传的错误文件。

最后再修改一下CrashReporter工程CrashReporter.cpp文件InitInstance函数里的下面这行代码:

ShellExecute(NULL, "open", "eMule.exe", NULL, NULL, SW_SHOW);

把eMule.exe改为你程序的文件名,要不然用户的程序崩溃后在屏幕上看到的是一只可爱的驴子,大概整个人也要被你搞崩溃了……

转载请注明:来自美味儿blog
本文地址:http://blog.meiweier.com/2010/03/19/mfc-application-crash.html

转载于:https://www.cnblogs.com/lzjsky/archive/2011/03/28/1997911.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30716725/article/details/99405649

智能推荐

linux loadavg详解(top cpu load)-程序员宅基地

文章浏览阅读241次。目录[隐藏]1Loadavg分析1.1Loadavg浅述1.2Loadavg读取1.3Loadavg和进程之间的关系1.4Loadavg采样218内核计算loadavg存在的问题2.1xtime_lock解析2.2全局load读写分离解xtime_lock问题2.3几个关键点:2..._$load_avg_per_cpu.max.warn

【数据结构初阶】八大排序(二)——快速排序&&冒泡排序-程序员宅基地

文章浏览阅读1.2k次,点赞53次,收藏39次。快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序时间复杂度:O(N*logN)空间复杂度:O(logN)稳定性:不稳定。

githubDesktop的使用说明(附下载链接)_下载了githubdesktop-程序员宅基地

文章浏览阅读1.3k次。step1 :下载百度云链接https://pan.baidu.com/s/1luAFF8gGddWFqgbq-_X0cg提取码: 5xdj包含 git github forwindows githubforMac 以及notepad++step2:安装这个安装程序,是强制安装路径的,所以不要乱搞 下载之后直接点击就行。@基本情况就是这样..._下载了githubdesktop

初探Java Nashorn脚本引擎-程序员宅基地

文章浏览阅读4.7k次。要想让一个程序功能变得灵活起来,那么配置绝对是不可或缺的,通过合理的设计,将所有动态变量都配置化,可以最大程度上让程序变得灵活。可是在某些复杂的业务场景中,仅仅只是变量的配置化,往往还并不能满足需求,尤其是互联网这种业务需要快速更迭的行业。于是,做一个这样的功能:仅仅依靠配置,就能让程序的逻辑cover住所有的业务逻辑变化,就成为了程序员的终极梦想。然而,现实是残酷的,"write once run forevre",这几乎是不可能实现的梦想(如果真的出现了这样的技术,那可能会是我们职业生涯将要面对的最_nashorn

【CTF】用python PIL将RGB值转化为图片_ctf 三个坐标值转换图像-程序员宅基地

文章浏览阅读1.5w次,点赞4次,收藏28次。一道关于ctf的题,用python将rgb值转化为图片_ctf 三个坐标值转换图像

海思HI35xx平台软件开发快速入门之背景知识-程序员宅基地

文章浏览阅读1.4k次。前言: 安防领域最近几年可谓暗流涌动,作为安防业的双寡头,大华股份与海康威视凭借行业的东风,两家公司的成长速度异常强劲,在国际市场上已经和应用厂家进行厮杀。 2015年两家公司双双晋升“全球安放50强”,海康排名第二,大华排名第五。以华为海思为代表国产芯片解决方案不断走强,在国际竞争中优势凸显,在后端NVR高端产品线先后推出了海思3531、海思3535、海思3536,同时针对低端的产品线也不..._海思hi35xx平台软件开发快速入门之背景知识

随便推点

LSB-tree理论证明理解_lsb tree-程序员宅基地

文章浏览阅读285次。一些基本公式和定义(1,c,p1,p2)(1,c,p1,p2)(1,c,p_1,p_2)敏感含义‖,‖≤r,Pr[]≥p1‖,‖≤r,Pr[]≥p1\|,\| \leq r, Pr[] \geq p_1, ‖,‖&gt;cr,Pr[]≤p2‖,‖&gt;cr,Pr[]≤p2\|,\| > cr, Pr[] \leq p_2基本LSH函数h(o)=⌊a⋅o+bw⌋h(o)=⌊a..._lsb tree

mathtype插入在WPS中出现The MathType DLL cannot be found问题_mathtype不能被发现-程序员宅基地

文章浏览阅读2k次。mathtype插入在WPS中出现The MathType DLL cannot be found问题_mathtype不能被发现

Lc.exe已退出代码为-1问题解决⽅法_lc.exe已退出 代码为-1-程序员宅基地

文章浏览阅读1.8k次,点赞2次,收藏3次。对于⽤vs作为开发⼯具的同学来说,可能常常会碰到“Lc.exe已退出代码为-1”的问题,造成这个结果的⼀般是因为加⼊了第三⽅的插件程序造成的,今天记录下如何解决。查看加载的程序项⽬,找到Properties⽂件夹licenses.licx⽂件,然后右键选择删除就可以了,调试运⾏正常了。可以使⽤⽂本编辑器打开上述⽂件,也可以使⽤其它的编辑器,在⽂件中查找licenses.licx字样,删除对应节点。找到你系统的*.csproj⽂件,这个⽂件是加载项⽬⽂件。c.exe已退出代码为-1问题解决⽅法。_lc.exe已退出 代码为-1

linux系统忘记登录密码怎么办_linux忘记密码-程序员宅基地

文章浏览阅读6.4k次,点赞7次,收藏29次。【代码】linux系统忘记登录密码怎么办。_linux忘记密码

Allegro经典报错解决方案_program has encountered a-程序员宅基地

文章浏览阅读1.4w次,点赞5次,收藏12次。Allegro软件经典报错解决方案Allegro经典报错解决方案初学者在用cadence画pcb的时候,偶尔会遇到像这样的问题。“Program has encountered a problem and must exit The design will besaved as a SAV file that can be recovered using dbdoctor (íf applic..._program has encountered a

tomcat11、tomcat10 安装配置(Windows环境)(详细图文)-程序员宅基地

文章浏览阅读1.7w次,点赞11次,收藏102次。Tomcat11、Tomcat10安装(详细)一、检查Java在Windows上的存在。二、查看tomcat版本规范,确定适合自己机器的tomcat版本。三、tomcat下载。下载目录里的文件分类类型说明。四、tomcat10安装。五、tomcat10安装不成功时解决方案。六、启动tomcat时运行界面乱码的解决方法。七、tomcat 相关配置文章............_tomcat10