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

如何调试程序的 Release 版本相关推荐

  1. VC++调试程序、快捷键以及Debug版本与Release版本

    1.如何在Release状态下进行调试 Project->Setting=>ProjectSetting对话框,选择Release状态.C/C++标签中的Category选General, ...

  2. VS Debug和Release版本的区别

    VS Debug和Release版本的区别 1. 变量. 大家都知道,debug跟release在初始化变量时所做的操作是不同的,debug是将每个字节位都赋成0xcc(注1),而release的赋值 ...

  3. c++中的Debug版本和Release版本的区别

    今天看Visual C++ 2012 入门经典,书上描述: Debug版本包括帮助用户调试程序的信息,使用程序的Debug版本,可以在出现问题时单步执行代码,以检查程序中的数据值. Release版本 ...

  4. Debug与Release版本的区别

    由于最近搞了个项目,在Dedug版本下正常,但Release版本就有问题,看样子还是debug版本和release版本的区别没有搞清楚. 有遇到下面3个问题: 1.Debug版本下程序可以正常运行退出 ...

  5. C++ debug和release版本的区别及调试技巧

    一.Debug 和 Release 编译方式的本质区别 Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序.Release 称为发布版本,它往往是进行了各种优化,使得程 ...

  6. debug版本和release版本的区别

    Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序.Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用. ...

  7. 为什么我的程序debug版本运行没有问题,而release版本总是报错?

    To   楼主   ,我在另外一个类似的贴子作了回答     http://expert.csdn.net/Expert/topic/2955/2955693.xml?temp=.3361933   ...

  8. ATS 6.2.1打release版本rpm包时插件中出现undefined symbol的问题追踪

    问题场景 我基于ATS 6.2.1社区版整合进一些插件,发现debug版本一直运行好好的,后来改为release版本(就是configure时不加--enable_debug)时,安装后显示下面的出错 ...

  9. git获取指定release版本代码

    首先手里必须有release的版本的备份出来的/.repo/manifests/default.xml文件,该文件记录了每个git库的在该版本下的具体的版本情况,整个代码的sync都是依据他来的: 1 ...

最新文章

  1. Linux学习笔记之文件管理和目录管理类命令
  2. webpack打包后自动弹出浏览器查看效果
  3. [每日电路图] 8、三轴加速度计LIS3DH电路图及功耗等指标
  4. 从体验上拉开差距,Serverless 将成就云计算的下一个 10 年!
  5. Java学习笔记53(网络编程:TCP协议案例)
  6. ecshop根目录调用_ecshop列表页 调用二级分类教程
  7. html调用deeplink,如何优雅地从浏览器打开本地应用deeplink
  8. 转:使用 Tkprof 分析 ORACLE 跟踪文件
  9. maven笔记(2)
  10. Jumpserver代码规范
  11. 【Oracle】解决问题:pl/sql developer 小钥匙图标下拉框中oracle连接串不加粗显示
  12. access ea 可以联网吗_如何看待EA在STEAM上推出EA Play(原EA Access会员)?
  13. android 传感器使用与开发---陀螺仪传感器
  14. 【CSS手册】css
  15. 大衣哥家的小伟和亚楠还能走多久?
  16. win10 查看版本信息(家庭版 专业版 企业版)
  17. Ubuntu16.04 GTX1050Ti安装CUDA10.0和cuDNN7.4.2
  18. 微信H5页面图片上传避坑指南(vant+vue)
  19. iOS App Thinning
  20. 两台虚拟机互相ping通(互相通讯)

热门文章

  1. 用 Keepalived+HAProxy 实现高可用负载均衡的配置方法
  2. 在Linux系统下更改或更新SSH密钥密码的方法
  3. postgresql授权和撤销
  4. 当程序发布特别慢的时候,如何高效使用Eclipse
  5. 关于模糊查询时的索引问题.(了解一下,对提高代码效率非常有好处)
  6. 国内访问 Atom 源很慢 解决方案
  7. 解决Chrome浏览器不能访问https网站的问题
  8. Linux服务器Cache占用过多内存导致系统内存不足问题的排查解决(续)
  9. 在SpringMVC中使用@RequestBody和@ResponseBody注解处理json时,报出HTTP Status 415的解决方案
  10. Android Fragment手柄后退按钮按下[重复]