Archive for May 16th, 2007
Add crash report to your application
By Charry
编写‘零缺陷’的软件是人们追求的目标,然而要做到真正的‘零缺陷’是不太可能的任务,即使的最简单的程序,我们也不敢保证它是一个理想的’bug-free’的产品。bug会贯穿一个产品的每个阶段。在开发阶段我们可以debug我们的代码,但到了后期,当我们把程序release给用户时,如果程序发生的问题,比如Crash,我们应该收集程序Crash的原因,以帮助我们修补程序的bug,现今有很多软件都提供了”Crash Report”的功能,最常见的就是MS的一些产品,在程序崩溃的时候,会出现一个对话框,提示我们程序崩溃了,是否愿意将崩溃时候的一些信息发给MS,以供开发人员调试之用。
且不说用户反馈的信息是否对我们有用,但说崩溃后提示:“程序崩溃,请blah, blah, blah”这样的字样,从某种意义上说就是在增强用户体验,因为比起程序咣当一声倒地身亡,这样起码给用户一个暗示:问题是有解决的途径的。
CodeProject上有篇文章详细的介绍了Crash Report,http://www.codeproject.com/debug/XCrashReportPt1.asp 。不过文章中介绍的内容是针对VC6的,对于VS2005还是有些问题的。我总结了一下,如何给VS2005的工程加入Crash Reprot的支持(如果是VC6的工程,请直接参考上面的链接)。
首先,去http://www.codeproject.com/debug/XCrashReportPt4.asp 下载DEMO程序,我们需要其中的XCrashReport,将它编译后,会生成XCrashReport.EXE。然后将
ExceptionAttacher.cpp
ExceptionHandler.cpp - 需要去除它的预编译头文件开关
ExceptionHandler.h
GetWinVer.cpp
GetWinVer.h
MiniVersion.cpp
MiniVersion.h
CrashFileNames.h
这个几个文件加入到工程中。注意,直接加入工程中并不能编译通过,作者在他的文章中提到了:“The Unicode implementation is not complete or tested.”,好在修改上面的错误也很简单,这里就不赘述了。然后将工程切换到release模式并打开工程的属性。先找到”C/C++->General”,把”Debug Information Format”设置为”Program Database(/Zi)”;然后找到”Linker->Debugging”,把”Generate Debug Info”设置为”Yes(/DEBUG)”;最后,找到”Linker->Command Line”,增加一个选项”/OPT:REF”。(好像VS2005缺省就是这样的设置)
保存好后,就可以编译您的工程了,把XCrashReport.exe 和你的EXE程序放到一起,这样在程序崩溃的时候,就会自动生成Crash Report。对于VC6编译出来的EXE程序,我们可以按照作者文章中介绍的那样,直接用VC IDE找到引发Crash的代码行,可是在VS2005下,我尝试了N次,始终不行。为了定位出错的代码行,我们还需要再下载一个工具,就是WinDbg。这是MS开发的一个非常有用的DEBUG工具,安装完毕后,将XCrashReport.EXE生成的”CRASH.DMP”的拖到WinDbg中,然后选择”File->Source File Path”设置工程源码的目录,选择”File->Symbol File Path”指向最后一次编译生成的pdb文件所在的目录,接下来在”View”菜单中打开”Call Stack”窗口,最后在”Command”窗口中输入:.ecxr 并回车,WinDbg就会显示Call Stack和引发Crash的代码。
最后补充一点,XCrashReport需要dbghelp.dll,Windows自带的dbghelp.dll可能无法正常使用,最好将原作者的DEMO中的dbghelp.dll一并copy了。还有填写接受report的email的时候,不要简单的写一个email,那样outlook不能正常的发送,得在email前面加上SMTP,例如:SMTP:test@hotmail.com 。
提醒一下:一定要把VC/VS2005生成的pdb文件备份好,以及和这个pdb文件对应的代码,如果代码改变了,WinDbg就不能跳到正确的代码行。
完!