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

来源:互联网 发布:数据分析应用 编辑:程序博客网 时间:2024/05/03 05:15

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

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

 

   

 

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

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

    1、PDB文件

    PDB(Program Database)文件中包含了exe程序所有的调试相关信息,具体可以查阅MSDN。当编译选项设置为/Zi,链接选项设置为/DEBUG,/OPT:REF时,就会生成工程的.pdb文件。具体到VC2005中,就是 Project Propertise -> C/C++ -> General -> Debug Information Format 项设置为 Program Database(/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模块都显示叉,提示找不到debug symbols。但是用打开按钮随便打开一个文件失败后,再新建就能成功。猜测可能是直接新建,定位PDB文件时的路径不对引起的。有源码,但是懒的看了呵呵,大家感兴趣可以试一下。

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