- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Debug和release的区别解读
Debug 和release 的区别
一.定义:
Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用在于一组编译选项
我们将默认的Debug和Release的选项设置进行比较,过滤掉相同设置,主要的不同如下:
编译选项:/Od?/D?_DEBUG?/Gm?/RTC1?/MDd?/FoDebug““?/ZI链接选项:/OUT:D:“MyProject“logging“Debug“OptionTest.dll?/INCREMENTALRelease设置:编译选项:/O2?/GL?/D?NDEBUG?/FD?/MD?/FoRelease““?/Zi链?接选项:/OUT:D:“MyProject“logging“Release“OptionTest.dll?/INCREMENTAL:NO
Debug 版本?? 参数?????? 含义?? /MDd /MLd 或 /MTd 使用 Debug runtime library(调试版本的运行时刻函数库)?? /Od 关闭优化开关?? /D _DEBUG 相当于 #define _DEBUG,打开编译调试代码开关(主要针对assert函数)?
assert是指编写代码时做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式。断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真。可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言,而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新起用断言? /ZI?? 创建 Edit and continue(编辑继续)数据库,这样在调试过程中如果修改了源代码不需重新编译?? GZ 可以帮助捕获内存错误?
/Gm??打开最小化重链接开关,减少链接时间??
?
Release 版本 参数含义?? /MD /ML 或 /MT 使用发布版本的运行时刻函数库?? /O1 或 /O2 优化开关,使程序最小或最快?? /D NDEBUG 关闭条件编译调试代码开关(即不编译assert函数)?? /GF 合并重复的字符串,并将字符串常量放到只读内存,防止被修改?
MDd与MD首先,Debug版本使用调试版本的运行时库(/MDd选项),Relase版本则使用的是发布版本的运行时库(vcrt.dll)。其区别主要在于运行时的性能影响。调试版本的运行时库包含了调试信息,并采用了一些保护机制以帮助发现错误,也因此,其性能不如发布版本。编译器提供的Runtime?Library很稳定,不会造成Release版本错误,倒是由于Debug版本的Runtime?Library加强了对错误的检测,如堆内存分配检查等,反而会报告错误,应当指出,如果Debug有错误,而Release版本正常,程序肯定是有Bug的,只是我们还没有发现。
ZI与Zi其次,/ZI选项与/Zi选项。通过使用/ZI选项,可以在调试过程修改代码?而不需要重新编译。这是个调试的好帮手,可如果我们使用Release版本,这将变得不可行。Od与O2/O2与/Od选项:Od是关闭编译器优化,普遍用于Debug版本。而O2选项是创建最快速代码,这当然是Release版本的不二选择。RTCx选?项/RTCx选项让编译器插入动态检测代码以帮助你检测程序中的错误。比如,它会将局部变量初始化为非零值。包括用0xCC初始化所有自动变量,0xCD初始化堆中分配的内存(即new的内存),使用0xDD填充被释放的内存(即delete的内存),0xFD初始化受保护的内存(debug版在动态分配内存的前后加入保护内存以防止越界访问)。这样做的好处是这些值都很大,一般不可能作为指针,考试,大提示作为数值也很少用到,而且这些值很容易辩认,因此有利于在Debug版本中发现Release版才会遇到的错误。另外,通过函数指针调用函数时,会通过检查栈指针验证函数调用的匹配性(防止原型不匹配)。使用/RTCx选项会造成Debug版本出错,而Release版本正常的现象,因为Release版中未初始化的变量是随机的,很可能使指针指向了有效但是错误的地址,从而掩盖了错误。这个编译选项只能在/Od选项下使用。Gm,INCREMENTAL?or?NO编译选项中的Gm和链接选项中的INCREMENTAL都只为一个目的,加快编译速度。我们经常遇上这样的问题,只修改了一个头文件,结果却造成所有动态库的重新编译。而这两个选项就是为了解决这样的问题。如果启用了/Gm开关,编译器在
文档评论(0)