debug和release不得不说的故事

7 篇文章 0 订阅
debug和release的区别说大不大,说小不小。从大的说,同一个程序的debug版可以正常运行,但是release版有可能就会出问题,对于大工程尤其如此。从小的说,二者的区别就是工程配置不同,但就是工程配置中的各种参数的搭配不同,就导致了编译、连接后生成的程序行为的差异。
       因为debug会往程序中掺杂进一些用于支持调试的信息,还会尽量弥补程序中的缺陷:比如帮忙初始化变量。总之,debug尽量让程序能够健壮运行,否则谈何调试。但是release版的程序就不会管那么多,你的程序爱跑成什么样就是什么样。罗嗦了这么多,下面进入正题。下面部分内容引用了网上的资料,感谢那些网友。
 
       随着时间的推移,原来的一个简单的播放器现在已经变成了一个挺象样的工程,复杂度不知不觉的大了很多。debug版运行已经基本没问题了,于是才想到看看release版如何。不看不知道,一看才知道事情有多么的不妙。
       随着鼠标的简单点击,工程摇身一变似乎就变成了release版。编译,VC竟毫不留情的给了我200多个warning和4个error,我当时那个汗啊~在我印象中debug和release的区别就是切换一下,没想到竟然这么打击人。没办法,硬着头皮想办法解决,总算compile通过,结果link的时候又给了我N多个错误,我倒~一阵眩晕后继续投入战斗,终于,link也通过了。运行,程序崩溃,我也崩溃了。我的两个小眼珠立即撞到屏幕上,紧贴着,然后啪嗒啪嗒相继掉到了桌面上。。
       从网上查阅了一些帖子,但是仍然没有解决问题,自己通过改动release的工程设置最终还是解决了问题。因此我就把出现这种情况的所有可能的情况整理一下,记录下来,供自己、也供别人参考翻阅。
 
 
一、debug版程序编译正常,release版程序编译出错
根据给出的warning和error进行相应处理就可以了。我今天遇到的两个情况比较典型,就错误例子列出:
1,200多个warning
       debug的warning level是3,而release的是4,debug的是我此前改的,因此把release的也改成3就屏蔽了那些错误。
2,4个error
       这些error都是说找不到某个头文件,比如“ fatal error C1083: Cannot open include file: 'asyncio.h': No such file or directory”。
       把debug的 Project Settings --> C/C++ --> Additional incluede directories中的内容也加到release同样的地方即可。
 
 
二、debug版程序连接正常,release版程序连接出错
       错误说是不能定位一些外部函数,比如“ error LNK2001: unresolved external symbol "public: virtual long __stdcall ”
       把debug中 Project Settings --> Link --> Object/library modules中的内容也加到release同样的地方即可,需要注意的是:把debug的目录名改成release。
 
       对于以上两种问题,只要搞清楚:debug和release的配置不会保持同步,因为这本来就是他们的唯一区别。
     
 
三、debug版程序运行正常,release版程序运行出错
1,经常测试软件的两种版本。
       这是一位网友给出的建议,个人感觉非常有用,应该作为一种编程习惯进行贯彻。这样做可以把后期的查错范围减到最小。
 
2,把warning level设置成3,并且消除debug中所有的warning。
       debug中的warning就有可能是造成release问题的原因。这也是一个良好的编程习惯。
 
2,
·检查是否有变量没有初始化,尤其是重要的控制变量。
       debug会对程序中没有初始化的局部变量进行初始化(全局变量在两种版本中都会被初始化),而release不会,因此release版中没有初始化的变量的值运行时是不确定的。而debug版中没有初始化的整型会被初始化为0,指针也会被初始化为0,也就是空指针。这样就可以避免很多错误,或者使得错误的出现有规律,便于查错。
 
·检查是否有多个线程共享的变量,这样的变量最好设置成 volatile。
       release默认情况下会对程序进行优化,这就包括变量的存储优化。比如,如果编译程序觉得有必要,他就会用一个寄存器来缓冲一个变量的值,更新变量的值时只更新相应的寄存器,只在必要时才更新内存,这样可以减少访存次数。但是,如果两个线程共享一个变量,而该变量被进行了上述的优化,那么更新变量的线程可能只更新到了寄存器,而另外一个访问的线程从内存取得的却不是最新的值。为了避免这种优化,可以在变量前加 volatile。
 
3,检查消息处理函数的声明中是否省略了参数说明。
       这种情况是我在网上查资料时看到最多的情况。具体我就不多说了,请参考[2]。
 
4,把release中的 Project Settings --> C/C++ --> Optimizations改成 Disable。
       也就是关闭优化功能,这是我解决自己遇到的问题采用的办法。会使得的程序比打开优化时大一点,运行的慢一点,但在急于运行release程序而又找不到错误的情况下还是很实用的。适于救火。
 
5,检查程序中debug和release的不同之处。
       可能debug和release配置中的其他的不同也会导致debug和release生成的程序行为不同,这就需要仔细对照二者的配置了。
 
参考文章:
[1] http://book.77169.com/ask9/ask157200.htm
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值