• 如何调试程序的 Release 版本


    很多时候程序的 Debug 版本运行没有任何问题,但是一旦发布 Release 版本后,运行就出错,着实让人郁闷。大家知道,VC++ 中 Release 版本是对无法对源代码进行调试的。一般的做法是在怀疑有错误的代码前后插入MessageBox 函数,在函数中显示可能导致错误的变量的值。或者插入写文件的语句,输出可能导致错误的变量的值到一个记录文件。其实,除了上面讲的这个办法之外,还有其它的途径来调试 Release 版本的。下面就结合自己的经验和网上查找的一些资料给出调试 Release 版本的两个方法:

    方法一、利用 *.PDB 符号文件调试 Release 版本
    在 VCKBASE 的在线杂志中有一篇参考文章:符号文件——Windows 应用程序调试必备(http://www.vckbase.com/document/viewdoc/?id=1710),文章谈到了如何产生 Release 版本二进制文件对应的 PDB 文件的问题。有了 PDB 文件后,就可以调试 Release 了,方法是:
        1、在Project Settings里选Settings For为All Configurations。 
        2、在C/C++标签中,Debug info 选 Program Database。 
        3、在Link 标签中,Category选 Debug,选中Debug info 复选框和Microsoft format。 
    进行了上述设置后,我们就可以像在调试版本中那样设置断点进行测试了,由于代码优化,有些变量观察不到,行的运行顺序可能也会不同。 
    有一点需要注意:ASSERT宏在 Release 版本中不起作用,在 Release 版本中应该使用 VERIFY 来代替 ASSERT 进行调试。如果发行版本运行有问题,可以先禁止所有代码优化再进行调试。

    方法二、在需要加断点的地方添加如下汇编语句: 
        __asm int 3 

    不过调试的时候无法显示C程序,只有asm代码。 
         
    此处 int 3 是专门用来设置断点的,是 CPU 定义的,Windows 和 DOS 下的大多数调试器都采用这种方法。

    网上也能找到相关主题的文章,可是总是有些细节说不清楚,参考多方面的叙述,总结如下。

    首先,彻底的release版本(VC默认)是无法进行源代码级别的调试的,即使从别的地方把pdb文件拷贝过来也没用。

    如果想要进行源代码级别的调试,在生成release版本(dll, exe, ocx)时就要把一些调试信息build到dll/exe/ocx中,并让编译程序生成对应的pdb文件来保存详细的调试信息,有了这样的exe/dll及pdb、源文件,就可以进行调试了。具体的步骤如下:

    1、  控制编译过程。VC->Project Settings-> C/C++ tab, General Category, Debug Info combo box, select Program Database. This setting will add the /Zi switch to your compiles. 不要选择 Program Database For Edit And Continue (/ZI),一般用不到。另外/Z7选项也可以,它跟/Zi的区别是/Z7 生成CodeView格式的调试信息,保存在obj文件中;/Zi 生成程序数据库格式的调试信息,保存在.PDB文件中。

    2、  控制链接过程。VC->Project Settings->Link tab, General Category, check Generate Debug Info. This setting turns on the /DEBUG switch to the linker. 作为可选项也可以在链接选项中键入/OPT:REF,这个选项告诉链接器不要为那些没有被调用的函数生成调试信息.但是实际上这个选项是不必要的,因为对于dll来说我们链接时无法知道哪些会被调用.另外即使不加这个选项无非也就是使得编译出来的exe/dll大一点而已,一般来说不是问题.

    有了调试信息,release版本跟debug版本的区别主要在于有没有进行优化.可能由于优化,release版本调试时源代码对不上当前执行状态,但是总比没有调试强.对于一个商业应用来说,尤其是客户那边出了问题就需要到客户那边调试的情况,特别需要release版本也带有调试信息.为了调试方便付出的代价就是生成的exe/dll比较大,这个代价是值得的.需要调试,把pdb文件和源代码拷贝带着就可以上路了.

  • 相关阅读:
    【7.19 graphshortestpath graphallshortestpaths函数】matlab 求最短路径函数总结
    【7.18 灾情巡视路线代码】
    【7.18总结】KM算法
    【7.17总结】 匈牙利算法(二分图最大匹配)
    动态规划 多段图最短路 有向图
    matlab 单元最短路 Dijkstra算法 无向图
    hdu 3536【并查集】
    博弈随笔
    AtCoder Regular Contest 094 D Worst Case【思维题】
    CODE FESTIVAL 2017 qual B C 3 Steps(补题)
  • 原文地址:https://www.cnblogs.com/kex1n/p/2248680.html
Copyright © 2020-2023  润新知