release和debug(release和debug的区别)
关于release和debug,release和debug的区别这个很多人还不知道,今天小六来为大家解答以上的问题,现在让我们一起来看看吧!
1、一、Debug 和 Release 编译方式的本质区别Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。
2、Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。
3、Debug 和 Release 的真正秘密,在于一组编译选项。
4、下面列出了分别针对二者的选项(当然除此之外还有其他一些,如/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 并没有本质的界限,他们只是一组编译选项的集合,编译器只是按照预定的选项行动。
5、事实上,我们甚至可以修改这些选项,从而得到优化过的调试版本或是带跟踪语句的发布版本。
6、二、哪些情况下 Release 版会出错有了上面的介绍,我们再来逐个对照这些选项看看 Release 版错误是怎样产生的1. Runtime Library:2. 优化:这类错误主要有以下几种:(1) 帧指针(Frame Pointer)省略(简称 FPO ):在函数调用过程中,所有调用信息(返回地址、参数)以及自动变量都是放在栈中的。
7、若函数的声明与实现不同(参数、返回值、调用方式),就会产生错误————但 Debug 方式下,栈的访问通过 EBP 寄存器保存的地址实现,如果没有发生数组越界之类的错误(或是越界“不多”),函数通常能正常执行;Release 方式下,优化会省略 EBP 栈基址指针,这样通过一个全局指针访问栈就会造成返回地址错误是程序崩溃。
8、C++ 的强类型特性能检查出大多数这样的错误,但如果用了强制类型转换,就不行了。
9、你可以在 Release 版本中强制加入 /Oy- 编译选项来关掉帧指针省略,以确定是否此类错误。
10、(2) volatile 型变量:volatile 告诉编译器该变量可能被程序之外的未知方式修改(如系统、其他进程和线程)。
11、(3) 变量优化:优化程序会根据变量的使用情况优化变量。
12、例如,函数中有一个未被使用的变量,在 Debug 版中它有可能掩盖一个数组越界,而在 Release 版中,这个变量很可能被优化调,此时数组越界会破坏栈中有用的数据。
13、当然,实际的情况会比这复杂得多。
14、与此有关的错误有:3. _DEBUG 与 NDEBUG :当定义了 _DEBUG 时,assert() 函数会被编译,而 NDEBUG 时不被编译。
15、除此之外,VC++中还有一系列断言宏。
16、这包括: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 控制。
17、4. /GZ 选项:这个选项会做以下这些事(1) 初始化内存和变量。
18、(2) 通过函数指针调用函数时,会通过检查栈指针验证函数调用的匹配性。
19、(防止原形不匹配)(3) 函数返回前检查栈指针,确认未被修改.三、怎样“调试” Release 版的程序1. 前面已经提过,Debug 和 Release 只是一组编译选项的差别,实际上并没有什么定义能区分二者。
20、我们可以修改 Release 版的编译选项来缩小错误范围。
21、如上所述,可以把 Release 的选项逐个改为与之相对的 Debug 选项,如 /MD 改为 /MDd、/O1 改为 /Od,或运行时间优化改为程序大小优化。
22、注意,一次只改一个选项,看改哪个选项时错误消失,再对应该选项相关的错误,针对性地查找。
23、这些选项在 ProjectSettings... 中都可以直接通过列表选取,通常不要手动修改。
24、由于以上的分析已相当全面,这个方法是最有效的。
25、2.你也可以像 Debug 一样调试你的 Release 版,只要加入调试符号。
26、在 Project/Settings... 中,选中 Settings for "Win32 Release",选中 C/C++ 标签,Category 选General,Debug Info 选 Program Database。
27、再在 Link 标签 Project options 最后加上 "/OPT:REF" (引号不要输)。
本文到此分享完毕,希望对大家有所帮助。
免责声明:本文由用户上传,与本网站立场无关。财经信息仅供读者参考,并不构成投资建议。投资者据此操作,风险自担。 如有侵权请联系删除!
-
预约红旗试驾通常需要满足以下条件:首先,您需要年满18周岁并持有有效的中国驾驶证。这是最基本的条件,因为...浏览全文>>
-
MINI试驾:线上+线下操作指南MINI试驾体验是了解这款经典车型的最佳方式。无论是线上预约还是线下体验,都需提...浏览全文>>
-
想要体验理想L6的魅力?只需几个简单步骤即可轻松预约试驾!首先,打开理想汽车官网或下载官方App,注册并登录...浏览全文>>
-
睿蓝汽车,为您带来一场奢华与科技交织的试驾之旅。无论您是追求速度与激情的驾驶爱好者,还是注重舒适与品质...浏览全文>>
-
金龙汽车作为国内知名的客车品牌,其试驾体验备受关注。对于新手来说,预约试驾是一次了解车辆性能的好机会,...浏览全文>>
-
哈弗H6试驾操作指南哈弗H6作为一款国产SUV的代表车型,以其高性价比和出色性能深受消费者喜爱。如果您计划进行...浏览全文>>
-
预约睿蓝汽车试驾是体验新能源车型的好机会。以下是新手操作的详细步骤:第一步:访问官方网站或下载官方APP。...浏览全文>>
-
试驾吉利汽车的吉利熊猫是一个了解这款车型性能和功能的好机会。以下是预约试驾的基本流程:第一步:访问官网...浏览全文>>
-
试驾长安CS75是一次令人愉悦的体验。从咨询开始,我便感受到销售人员的专业与热情。他们详细解答了我的疑问,...浏览全文>>
-
长安凯程试驾预约,让您的驾驶体验更加便捷与愉悦。无论您是想感受新车型的强劲动力,还是希望深入了解车辆性...浏览全文>>
- 睿蓝汽车预约试驾,新手必知的详细步骤
- 小鹏G7试驾,新手必知的详细步骤
- 五菱星光试驾,开启完美驾驭之旅
- 伊兰特试驾,感受豪华与科技的完美融合
- 道郎格试驾,感受豪华与科技的完美融合
- 奇瑞新能源预约试驾,新手必知的详细步骤
- 万象汽车试驾,轻松开启试驾之旅
- 上汽大通MAXUS预约试驾操作指南
- 试驾红旗HS3 PHEV,新手必看的详细流程
- 特斯拉Model Y试驾预约,从预约到试驾的完美旅程
- 阜阳帕萨特多少钱 2025款落地价,各配置车型售价全解析
- 试驾雷克萨斯ES如何快速锁定试驾名额?
- 阜阳ID.4 CROZZ多少钱?选车指南与落地价全解析
- 君越试驾流程讲解
- 试驾世家,快速上手,开启豪华体验
- 莲花跑车试驾预约操作指南
- 东风风行试驾,如何快速预约并体验驾驶乐趣?
- 池州途观X新车报价2024款,最低售价25.08万起,购车攻略来了
- 安徽安庆途观L多少钱?购车攻略全解析
- 安庆ID.4 X新车报价2025款与配置的完美平衡