来公司做的第二个小项目CrashReport,最近要提交代码了,虽然项目含金量小,但在这里做一下总结。
CrashReport顾名思义,就是系统发生崩溃时提交报告的机制,在很多软件上都可以发生这个功能。原理就是SEH(结构化异常处理),重写main函数,在主线程中添加__try,__except块。当异常发生时,操作系统会进入异常过滤器函数,传入异常信息结构。我们在异常过滤函数里保存内存信息、堆栈、截图、用户文件、dmp文件等。然后开一个进程,把这些东西打包发送到公司的邮箱里。
原理虽然简单,但有些细节需要考虑。
1.异常是否可处理,让程序继续运行。
2.SEH是基于线程的,对于多线程软件,如何处理各个线程。
3.操作系统不能处理的异常必须让软件挂掉
4.异常处理的顺序,注意release和debug是不同的,很多异常只在release才捕捉得到。
。。。。
参考资料:
《windows 核心编程》
《深入研究 Win32 结构化异常处理》http://vicchina.51.net/research/other/seh/crashcourse/intro.htm
《Walking the callstack 》http://www.codeproject.com/KB/threads/StackWalker.aspx
《异常处理的几个办法》http://blog.csdn.net/lusuo778/archive/2010/04/08/5459071.aspx
《Catch All Bugs with BugTrap!》http://www.codeproject.com/KB/applications/BugTrap.aspx
《XCrashReport : Exception Handling and Crash Reporting - Part4》http://www.codeproject.com/KB/debug/XCrashReportPt4.aspx
《初步了解google-breakpad》http://www.missdeer.com/?p=736
http://www.bianceng.cn/Programming/cplus/201010/19545.htm
翻译:http://www.cnblogs.com/awpatp/archive/2010/06/15/1758763.html
http://www.cnblogs.com/feiyucq/archive/2010/05/10/1732077.html
博客:http://blog.csdn.net/chief1985/archive/2008/05/13/2443260.aspx