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

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

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

又比如迅雷:

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

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

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

上面这幅图就是电驴的源代码包,我们要用到的就是那个被我选中的“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

MFC程序崩溃的友好处理相关推荐

  1. MFC 程序崩溃自动重启 和 未捕获到的异常写退出栈

    MFC 程序崩溃自动重启 和 未捕获到的异常写退出栈 2013-09-11 09:39:04|  分类: VS编译集合|举报|字号 订阅 下载LOFTER 我的照片书  | http://blog.c ...

  2. MFC使用GetDlgItem获取控件导致程序崩溃的问题

    对于MFC窗口,在没有被创建完成时,是无法获取控件资源的.如果将GetDlgItem写在窗口类构造函数中,就会导致程序崩溃 正确方法是将GetDlgItem放在窗口类的OnInitDialog函数中执 ...

  3. MFC程序提示 0xC0000005: 读取位置 0x00000020 时发生访问冲突。

    这个bug困扰我两天了,我在win7下开发的MFC程序,在win7下一只运行良好,放到同事的win10机子上就出问题了,在点击按钮弹出子窗口时必崩,在win7下仔细调试才发现:调用DoModal()后 ...

  4. MFC程序打开文件对话框出错的问题解决

    前几天从网上下了个图像分析的mfc小程序,是VC6的 用VC6在本地编译生成都没问题.执行起来弹出一个未处理的错误,程序崩溃退出. 想起来原来遇到过打开文件对话框方面的问题,当时项目时间紧张未能深究. ...

  5. android 程序崩溃处理,Android应用崩溃的应急处理

    在我们开发Android应用程序的时候总是难免遇到程序崩溃的问题:(很抱歉,"××"已停止运行.) 每次看到这个问题心都是哇凉哇凉的 一般遇到这样问题,有两种可能: 1.自己的代码 ...

  6. assert 闪退 android,strcpy函数导致release版程序崩溃

    最近在写一个读取模型文件的小程序.很随意的使用了strcpy函数进行char字符数组的拷贝,这个数组是需要传递给PostMessage作为WPARAM的参数.代码部分如下: char pStrCurr ...

  7. c语言中字符串数组的地址存放以及%s输出单个字符导致程序崩溃的问题

    代码 总结下c语言中字符串数组的地址存放问题 #include <iostream> using namespace std; #include<bits/stdc++.h>i ...

  8. Linux下程序崩溃dump时的 core文件的使用方法

    Linux下程序崩溃dump时的 core文件的使用方法 1.在启动程序前执行 ulimit -c unlimited unlimited 表示生成文件的大小限制,也可以修改为自定义的大小,例如: u ...

  9. 基于Dialog的MFC程序在启动时隐藏为托盘程序(四)

    这部分说一下如何加menu..如果做小气球.. mfc的menu确是不如C#活着java那么easy.. 首先在rc里添加menu资源..然后在ui界面里先设置一下你的菜单.. 在第(二)部分已经简单 ...

最新文章

  1. 【Python】编程笔记8
  2. 使用域名访问后台页面
  3. Linux下几款C++程序中的内存泄露检查工具
  4. 如何基于Dataphin实现敏感数据保护
  5. regini.exe使用方法
  6. linux+读取初始化文件,Linux 初始化系统 SystemV Upstart
  7. jsoup Cookbook(中文版)
  8. 安卓系统管理软件_26号免费软件集合
  9. c语言二进制转十进制大小,c语言二进制转换成十进制的方法
  10. 渥太华大学计算机科学,加拿大渥太华大学计算机科学CO-OP录取
  11. linux 64 输入法下载,搜狗输入法 for Linux
  12. postgreSql连接报不支持10验证类型
  13. Quoted-printable1(BUCTF在线评测)
  14. mysql导vertica_vertica使用vsql导数据
  15. Jetpack Compose中的Modifier
  16. VS2015安装失败
  17. PYQT5 QGridLayout及setRowStretch、setColumnStretch用法简探
  18. java localdate_Java LocalDate now()用法及代码示例
  19. Laravel Eloquent 小技巧
  20. 徽商袁地保拍得史玉柱三小时 花196万学做慈善

热门文章

  1. Nacos自定义共享 Data Id 配置
  2. SpringSecurity过滤器链加载原理
  3. SpringSecurity权限管理介绍
  4. Nginx反向代理之proxy_set_header指令
  5. Spring JDK内置类型
  6. 微服务与Spring-Cloud的关系(区别)
  7. 简单了解各种序列化技术-JSON序列化框架
  8. 用注解还是用xml 配置?
  9. Spring 中的代理选择原则
  10. Quartz框架中的JobStore