调试Release发布版程序的Crash错误(三)

来源:互联网 发布:轻量级c语言ide 编辑:程序博客网 时间:2024/04/30 14:28

根据前面两篇博文,我们要定位崩溃行代码,必须要自己根据相关信息文件进行计算。如果需要处理的量比较大,恐怕会很费力气。有没有更简单快速的办法呢?

   最直接的想法就是写一个小工具,根据规则和信息进行自动定位,不过开发起来也是要费一番功夫的。令人开心的是,我们可以找到类似的工具,而且是开源免费的!程序员的世界也许很多时候都是这么单纯而乐于分享!

 

   方案三:崩溃地址 + PDB文件 +CrashFinder

   CrashFinder是一个开源工具,作者是JohnRobbin,大家可以去他的blog上去找关于CrashFinder的信息。我们这里以CrashFinder2.5版本为例介绍,相关文章链接为:http://www.wintellect.com/CS/blogs/jrobbins/archive/2006/04/19/crashfinder-returns.aspx

   1、PDB文件

   PDB(ProgramDatabase)文件中包含了exe程序所有的调试相关信息,具体可以查阅MSDN。当编译选项设置为/Zi,链接选项设置为/DEBUG,/OPT:REF时,就会生成工程的.pdb文件。具体到VC2005中,就是Project Propertise -> C/C++ ->General -> Debug Information Format 项设置为 ProgramDatabase(/Zi),Linker -> Debugging ->Generate Debug Info 项设置为 Yes(/Debug),Linker ->Optimization -> References 项设置为Eliminate Unreferenced Data(/OPT:REF)。

   只要设置以上选项,release版本也能生成PDB文件。当然,对应的应用程序也会稍大。

   2、CrashFinder

   CrashFinder能够运行需要两个条件:一是系统必须要有dbghelp.dll文件;二是PDB文件必须与exe文件在一个路径下。对于dbghelp.dll,一般在系统system32路径下都有,如果没有下载一个放到这个目录下就可以了。

   先看一下CrashFinder的界面。

 

调试Release发布版程序的Crash错误(三)

   用起来也非常简单。首先选择File->New或点击工具栏新建按钮,选择要调试的exe文件打开,会发现exe及所依赖的dll文件信息都已经加载进来。在下半部分的编辑框中输入崩溃地址(16进制),点右边的“Find”按钮,就会在下面显示崩溃的源文件路径、名称以及崩溃所在行号了,如下图所示。

调试Release发布版程序的Crash错误(三)

   用CrashFinder进行crash定位真的非常方便。但是我在使用过程中发现了一个bug,每次启动程序后,直接新建的话加载进来的exe模块都显示叉,提示找不到debugsymbols。但是用打开按钮随便打开一个文件失败后,再新建就能成功。猜测可能是直接新建,定位PDB文件时的路径不对引起的。有源码,但是懒的看了呵呵,大家感兴趣可以试一下。

   好了,方案三就介绍到这里,后面还有更加强大的方案 : )