问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

release和debugrelease和debug的区别

发布网友 发布时间:2024-05-03 11:17

我来回答

1个回答

热心网友 时间:2024-12-05 19:41

关于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" (引号不要输)。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...乱弹flash游戏广告(少儿不宜类)的病毒到底怎么杀?? 手机老是出现少儿不宜的软件 老是宣传 还让下载 恢复出厂设置也不 钢材商贸公司怎么取名好听 钢材贸易公司起名字大全免费 您好,我现在20多岁,有一个演员梦,我不怕吃苦,就是想演戏,可是我性格有... ...我想当演员,因为我的梦想也是做一名演员,我相信我自己能做好_百度知... 我是淘宝新手卖家,有供应商主动邀请我分销他的产品,这其中有什么不妥... 淘宝旺旺里有个阿里巴巴供应商说交900元帮我运营店铺,说能赚钱,有企业... 初中仁爱版英语总复习练习册多少钱 英语八年级下册复习(仁爱版本) 桐庐大奇山门票是多少? 盐盘申通的联系电话给我下 黑狗晚上总是睡在枕头边上好下好 刚玩公路车,大家觉得闪电这款公路车怎样 慢性浅表性胃炎和十二指肠球部溃疡。还有点糜烂。能不能喝汤呢,如鸡汤... 湖北省恩施州建始县城区周围哪些地方好骑车去玩啊? 从湖北民族学院到大沙坝怎么坐车?想去野炊来着,希望知情人帮忙解答_百... 有哪位高手晓得恩施哪里适合野炊啊?谢谢哦!!! EXCEL单元格怎么上下左右移动? 陈梦获得直通赛冠军,是提前锁定了奥林匹克运动会女子单打参赛名额吗... 焖面没有熟怎么补救焖面没熟的解决办法 ...平均产量递增;边际产量小于平均产量时,平均产量递减啊 手机里面的ROM是什么意思? 电脑的rom是什么意思? 青州坡子村委属于哪个邮政快递 花芊果减肥有效吗? 芊约减肥在哪加盟? 淮阳县峰华置业有限公司怎么样? 在淮阳中银富登上班有车吗 拉伸脖子是什么意思? 开奖结果后面有自选单式自选复式,自动什么意思 怎么夸克切屏? 早产生的小猫肚子发黑死了 为什么有些企业的账面盈利很多却不用交税呢? 如何理解中央银行是"银行的银行"? 形容"一件事情做得还不错"有哪些成语 开在尘埃里的花不起眼的向日葵怀远近美文摘抄 ...4股,5股,6股,还有麻花辫怎么编呢,我要看图解,文字的就算了,谢咯_百... ...食品机械有限公司呆过啊?那里现在的(2013)应届毕业生待遇如何... 徐州徐工传动科技有限公司怎么样 ...待遇方面的排名怎么样? 是不是只要是徐工的分公司待遇都好 富民县有什么秋季旅游打卡的好去处? 云南富民县有哪些适合家庭游玩的小众景点? 常期吃止痛药对身体有什么危害 电车充18个小时有问题吗? 衡阳有哪些风景优美的公园? 衡阳机场到衡阳宝盖银杏林怎么走 大学英语四六级可以在外校报名么?或者是异地报名,我在外地上学,但是我... 魔兽插件DPS怎么重置? 中‌老年‌人睡得少睡不着如何用药? 自体脂肪填充脸颊能管多久