鹏仔先生-趣站-一个有趣的网站!
鹏仔先生

鹏仔先生

当前位置:网站首页 > 文字大全 > 正文

release和debug的区别

作者:百变鹏仔日期:2023-08-02 07:18:47浏览:9分类:文字大全

release和debug的区别

一、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:

2. 优化:这类错误主要有以下几种:

(1) 帧指针(Frame Pointer)省略(简称 FPO ):在函数调用过程中,所有调用信息

(返回地址、参数)以及自动变量都是放在栈中的。若函数的声明与实现不同(参数、返

回值、调用方式),就会产生错误————但 Debug 方式下,栈的访问通过 EBP 寄存器

保存的地址实现,如果没有发生数组越界之类的错误(或是越界“不多”),函数通常能

正常执行;Release 方式下,优化会省略 EBP 栈基址指针,这样通过一个全局指针访问栈

就会造成返回地址错误是程序崩溃。C++ 的强类型特性能检查出大多数这样的错误,但如

果用了强制类型转换,就不行了。你可以在 Release 版本中强制加入 /Oy- 编译选项来关

掉帧指针省略,以确定是否此类错误。

(2) volatile 型变量:volatile 告诉编译器该变量可能被程序之外的未知方式修改

(如系统、其他进程和线程)。

(3) 变量优化:优化程序会根据变量的使用情况优化变量。例如,函数中有一个未被

使用的变量,在 Debug 版中它有可能掩盖一个数组越界,而在 Release 版中,这个变量

很可能被优化调,此时数组越界会破坏栈中有用的数据。当然,实际的情况会比这复杂得

多。与此有关的错误有:

3. _DEBUG 与 NDEBUG :当定义了 _DEBUG 时,assert() 函数会被编译,而 NDEBUG 时不

被编译。除此之外,VC++中还有一系列断言宏。这包括:

ANSI C 断言 void assert(int expression );

C Runtime Lib 断言 _ASSERT( booleanExpression );

_ASSERTE( booleanExpression );

MFC 断言 ASSERT( booleanExpression );

VERIFY( booleanExpression );

ASSERT_VALID( pObject );

ASSERT_KINDOF( classname, pobject );

ATL 断言 ATLASSERT( booleanExpression );

此外,TRACE() 宏的编译也受 _DEBUG 控制。

4. /GZ 选项:这个选项会做以下这些事

(1) 初始化内存和变量。

(2) 通过函数指针调用函数时,会通过检查栈指针验证函数调用的匹配性。(防止原

形不匹配)

(3) 函数返回前检查栈指针,确认未被修改.

三、怎样“调试” Release 版的程序

1. 前面已经提过,Debug 和 Release 只是一组编译选项的差别,实际上并没有什么

定义能区分二者。我们可以修改 Release 版的编译选项来缩小错误范围。如上所述,可以

把 Release 的选项逐个改为与之相对的 Debug 选项,如 /MD 改为 /MDd、/O1 改为 /Od

,或运行时间优化改为程序大小优化。注意,一次只改一个选项,看改哪个选项时错误消

失,再对应该选项相关的错误,针对性地查找。这些选项在 Project\Settings... 中都可

以直接通过列表选取,通常不要手动修改。由于以上的分析已相当全面,这个方法是最有

效的。

2.你也可以像 Debug 一样调试你的 Release 版,只要加入调试符号。在 Project/S

ettings... 中,选中 Settings for "Win32 Release",选中 C/C++ 标签,Category 选

General,Debug Info 选 Program Database。再在 Link 标签 Project options 最后

加上 "/OPT:REF" (引号不要输)。

“送给”英语说法:send

读法: 英?[send]? ? ?美?[send]?

释义:v. (动词)派遣,派人,差使,安排去,发射,打发,寄,送给,发送

词汇搭配

用作动词 (v.)

~+名词

send a letter 寄信 send a message 捎信 send goods 发货

~+副词

send abroad 派出国? send ahead 选派,派在前头? send early 早些发出

~+介词

send as 派作为…? send by 以…方式寄出? send by mail 邮寄

扩展资料

词语用法

1、send的基本意思是“派; 打发”,指通过某人或某种手段把东西送给某人或送到某目的地。也可作“用无线电波发送”“使…猛然或迅速移动”“发出信息”等解。

2、用于比喻,send还可作“使…兴奋,使激动”“施与,赐给”解。

3、send也可用作使役动词,作“使…处于”“使…变得”解。

4、send可用作及物动词,也可用作不及物动词。用作及物动词时接名词或代词作宾语。也可接双宾语,其间接宾语可转化为介词to的宾语。用作不及物动词时多接动词不定式作状语,表示目的。

5、send还可接以形容词、动词不定式、现在分词、介词短语充当补足语的复合宾语。

鹏仔 微信 15129739599

百科狗 baikegou.com

免责声明:我们致力于保护作者版权,注重分享,当前被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!邮箱:344225443@qq.com)

图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

  • 上一篇:已经是第一篇了
  • 下一篇:已经是最后一篇了
内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国教育事业出一份力,发布内容不收取任何费用也不接任何广告!)