zoukankan      html  css  js  c++  java
  • 如何调试Release版(转)

    http://www.cnblogs.com/kex1n/archive/2011/11/14/2248680.html

    很多时候程序的 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文件和源代码拷贝带着就可以上路了.

  • 相关阅读:
    PHP 开发 APP 接口 学习笔记与总结
    Java实现 LeetCode 43 字符串相乘
    Java实现 LeetCode 43 字符串相乘
    Java实现 LeetCode 43 字符串相乘
    Java实现 LeetCode 42 接雨水
    Java实现 LeetCode 42 接雨水
    Java实现 LeetCode 42 接雨水
    Java实现 LeetCode 41 缺失的第一个正数
    Java实现 LeetCode 41 缺失的第一个正数
    Java实现 LeetCode 41 缺失的第一个正数
  • 原文地址:https://www.cnblogs.com/daidaigua/p/2528615.html
Copyright © 2011-2022 走看看