程序Release和Debug的区别.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
程序Release和Debug的区别

Release?VS?Debug ?可以这么说:release版本取掉了debug信息,进行了优化。 ????举个例子:那断言----Assertion来说,很多库函数本身的实现代码里,包含了很多的断言。通过ASSERT宏来声明这些断言,这个宏只有在程序?的debug版里才有效。而在release版里它完全被忽略,?为的也就是减少系统的消耗,?至于debug版本运行结果正确,可release版却出错,可能的问题也就在这些断言里,特别是自己写的断言。 ????比如ASSERT(***)?这***里不光是判断,如果还有其他创建之类的操作,到了release版,被忽略后,也就容易带来问题。?举个例子:?int?a;?debug时a值恒定,总为cdcdcdcd?release时a值不定,为当时内存值?这时你在使用a时就会引起结果的不一致,甚至导致溢出!所以对变量初始化尤其是对指针,数组变量初始化是一个良好的习惯!?debug与release的不同大多是因为程序代码写的不规范,不严谨而造成的。 ?关于Debug和Release之本质区别的讨论~~(主要针对VC6.0和VS2003.net编译工具而言) 一、Debug?和?Release?编译方式的本质区别 ????Debug?通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release?称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。 ????Debug?和?Release?的真正秘密,在于一组编译选项。下面列出了分别针对二者的选项(当然除此之外还有其他一些,如/Fd?/Fo,但区别并不重要,通常他们也不会引起?Release?版错误,在此不讨论) ??? Debug?版本: ?/MDd?/MLd?或?/MTd???使用?Debug?runtime?library(调试版本的运行时刻函数库) ?/Od?????????????????关闭优化开关 ?/D?_DEBUG?????????相当于?#define?_DEBUG,打开编译调试代码开关(主要针对 ?????????????????????assert函数) ?/ZI?????????????????创建?Edit?and?continue(编辑继续)数据库,这样在调试过 ?????????????????????程中如果修改了源代码不需重新编译 ?/GZ?????????????????可以帮助捕获内存错误 ?/Gm?????????????????打开最小化重链接开关,减少链接时间 ???????????????????? Release?版本:?????? ?/MD?/ML?或?/MT??????使用发布版本的运行时刻函数库 ?/O1?或?/O2??????????优化开关,使程序最小或最快 ?/D?NDEBUG?????????关闭条件编译调试代码开关(即不编译assert函数) ?/GF?????????????????合并重复的字符串,并将字符串常量放到只读内存,防止 ?????????????????????被修改 ????实际上,Debug?和?Release?并没有本质的界限,他们只是一组编译选项的集合,编译器只是按照预定的选项行动。事实上,我们甚至可以修改这些选项,从而得到优化过的调试版本或是带跟踪语句的发布版本。 ??? 二、哪些情况下?Release?版会出错 ????有了上面的介绍,我们再来逐个对照这些选项看看?Release?版错误是怎样产生的 ??? ?1.?Runtime?Library:链接哪种运行时刻函数库通常只对程序的性能产生影响。调试版本的?Runtime?Library?包含了调试信息,并采用了一些保护机制以帮助发现错误,因此性能不如发布版本。编译器提供的?Runtime?Library?通常很稳定,不会造成?Release?版错误;倒是由于?Debug?的?Runtime?Library?加强了对错误的检测,如堆内存分配,有时会出现?Debug?有错但?Release?正常的现象。应当指出的是,如果?Debug?有错,即使?Release?正常,程序肯定是有?Bug?的,只不过可能是?Release?版的某次运行没有表现出来而已。 ? ?2.?优化:这是造成错误的主要原因,因为关闭优化时源程序基本上是直接翻译的,而打开优化后编译器会作出一系列假设。这类错误主要有以下几种: ? ????(1)?帧指针(Frame?Pointer)省略(简称?FPO?):在函数调用过程中,所有调用信息(返回地址、参数)以及自动变量都是放在栈中的。若函数的声明与实现不同(参数、返回值、调用方式),就会产生错误?————但?Deb

文档评论(0)

yaobanwd + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档