软件总存在这样或者那样的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改为你程序的文件名,要不然用户的程序崩溃后在屏幕上看到的是一只可爱的驴子,大概整个人也要被你搞崩溃了……
相关推荐
在开发Windows应用程序时,我们经常...总的来说,通过结合C++的异常处理机制、MFC对话框以及全局异常过滤器,我们可以实现一个类似QQ的崩溃错误报告功能,为用户提供友好的错误提示,并帮助开发者快速定位和修复问题。
本文将深入探讨如何在VS2010基于MFC的项目中有效地查找和修复bug,以及如何实现优雅的程序崩溃。 首先,了解MFC框架是必要的。MFC是微软为Windows平台提供的一个C++库,它封装了Windows API,使得开发者可以使用...
在编写MFC程序时,应考虑异常处理,确保程序在遇到错误时能够优雅地退出,而不是崩溃。使用`try-catch`语句可以捕获并处理可能出现的异常情况。 9. **调试与测试** 使用Visual Studio的调试工具,如断点、监视...
- 错误处理不足,程序崩溃时无法提供有效的反馈。 通过分析和重构这个小程序,开发者可以深入理解MFC的工作原理,提高代码质量,并学习如何构建一个完整的Windows应用程序。对于想要提升MFC编程技能的人来说,这是...
这样的功能对于那些需要长时间稳定运行且不能容忍程序崩溃或无响应的应用场景特别有用,比如服务器后台服务、自动化流程等。 首先,我们要理解这个看门狗程序的工作原理。它通过定期向被监控的程序发送特定的信号,...
合理的错误处理能让程序更健壮,避免因用户操作不当导致程序崩溃。 7. **界面反馈**:在拖放过程中,提供适当的视觉反馈也很重要。例如,当鼠标进入窗口时改变光标形状,或者在拖放操作成功后显示提示信息。 8. **...
9. **异常处理**:良好的程序设计应包含异常处理机制,确保在遇到错误时能优雅地处理,避免程序崩溃。 10. **用户界面设计**:为了提供良好的用户体验,界面设计要直观易用,包括清晰的时间显示、易于操作的控制项...
在IT行业中,程序崩溃是常见的问题,特别是在软件开发和调试阶段。当程序因各种原因(如内存溢出、空指针引用、除以零等)无法正常运行时,崩溃会生成一个堆栈跟踪,这对于诊断问题至关重要。"程序崩溃后,记录下...
- 考虑添加错误处理代码,以防止程序因意外情况而崩溃。 6. **优化与完善**: - 可以考虑添加帮助文档或教程,让初学者更好地理解游戏规则和操作方式。 - 对界面进行美化,使用合适的颜色、字体和图标提升用户...
在这种情况下,程序应该抛出一个错误信息,而不是让程序崩溃。此外,还应考虑输入的有效性,例如,防止用户输入非法字符或超出范围的数字。 最后,对程序进行调试和测试是非常重要的,确保所有的运算都能正确无误地...
例如,如果用户输入了无效的时间,程序应该给出提示,而不是导致程序崩溃。 通过学习和实践这个项目,开发者不仅可以掌握MFC的基本用法,还能深入了解Windows系统级别的操作,提升其在系统管理和应用程序开发方面的...
10. **异常处理**:在开发过程中,良好的异常处理机制可以确保程序在遇到错误时能够优雅地退出,而不是崩溃。MFC支持C++的异常处理机制,应合理利用try-catch块处理可能出现的异常。 通过以上知识点的集成与实践,...
MFC提供了异常处理机制,可以捕获运行时的错误,并进行适当的处理,避免程序崩溃。 9. **多线程编程** 如果系统需要同时执行多个任务,如后台数据更新,就需要使用多线程。MFC提供了对多线程的支持,开发者需要...
6. **错误处理与调试**:在源代码中,良好的错误处理机制是必要的,它可以保证程序在遇到异常情况时能够给出友好的提示,而不是突然崩溃。同时,MFC提供了调试支持,帮助开发者定位和修复程序中的问题。 通过对这个...
同时,使用MFC的异常处理机制,确保程序在遇到问题时能给出友好的提示,而非突然崩溃。 总的来说,通过结合Halcon的图像处理能力和MFC的图形用户界面开发能力,我们可以构建出功能强大且易于操作的机器视觉系统。这...
同时,为了确保软件的稳定运行,错误处理和异常处理机制也是必不可少的,这有助于在遇到问题时给出友好的提示,防止程序崩溃。 总的来说,《英语学习词典》借助MFC的强大功能,为用户提供了一个高效、便捷的英语...
开发者需使用MFC提供的异常处理机制,确保程序在遇到错误时能够给出适当的提示,避免程序崩溃。 10. **调试与测试**:在系统开发过程中,调试和测试是必不可少的环节。MFC提供了丰富的调试工具,如断点、单步执行、...
3. **错误处理**:合理处理各种异常情况,例如非法的落子位置,防止程序崩溃。 4. **用户体验**:确保图形界面的响应速度和流畅性,提供友好的提示信息。 总的来说,“基于单文档的MFC五子棋”项目不仅展示了MFC库...
7. **错误处理**:一个良好的MFC应用会包含充分的错误处理机制,如异常处理,确保在遇到问题时能够提供适当的反馈,避免程序崩溃。 综上所述,"MFC的学生管理系统"是一个基于MFC技术,结合Access数据库,实现了学生...
8. 错误处理和异常安全:在设计系统时,应考虑到错误处理和异常安全,确保在出现错误或异常情况时,能够优雅地恢复或给出提示,避免数据丢失或程序崩溃。 9. 用户界面设计:MFC提供了丰富的UI组件,如菜单、工具栏...