- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Debug_release的区别
??????????? 一、Debug 和 Release 编译方式的本质区别
??? Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程
序。Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度
上都是最优的,以便用户很好地使用。
??? Debug 和 Release 的真正秘密,在于一组编译选项。下面列出了分别针对二者的选项
(当然除此之外还有其他一些,如/Fd /Fo,但区别并不重要,通常他们也不会引起 Rele
ase 版错误,在此不讨论)
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 ):在函数调用过程中,所有调用信息
(返回地址、参数)以及自动变量都是放在栈中的。若函数的声明与实现不同(参数、返
回值、调用方式),就会产生错误----但 Debug 方式下,栈的访问通过 EBP 寄存器
保存的地址实现,如果没有发生数组越界之类的错误(或是越界不多),函数通常能
正常执行;Release 方式下,优化会省略 EBP 栈基址指针,这样通过一个全局指针访问栈
就会造成返回地址错误是程序崩溃。C++ 的强类型特性能检查出大多数这样的错误,但如
果用了强制类型转换,就不行了。你可以在 Release 版本中强制加入 /Oy- 编译选项来关
掉帧指针省略,以确定是否此类错误。此类错误通常有:
???? ● MFC 消息响应函数书写错误。正确的应为
????? afx_msg LRESULT OnMessageOwn(WPARAM wparam, LPARAM lparam);
????? ON_MESSAGE 宏包含强制类型转换。防止这种错误的方法之一是重定义 ON_MESSAGE
?宏,把下列代码加到 stdafx.h 中(在#include afxwin.h之后),函数原形错误时编译
会报错
????? #undef ON_MESSAGE
????? #define ON_MESSAGE(message, memberFxn) \
????? { message, 0, 0, 0,
文档评论(0)