Debug和Release之区别

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情


关于Debug和Release之本质区别的讨论本文主要包含如下内容:
1. Debug 和 Release 编译方式的本质区别
2. 哪些情况下 Release 版会出错
2. 怎样“调试” 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:

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" (引号不要输)。 

DebugRelease 什么是Debug? DEBUG是计算机排除故障的意思。马克2号(Harvard Mark II)编制程序的格蕾丝·霍珀(Grace Hopper)是一位美国海军准将及计算机科学家,同时也是世界最早的一批程序设计师之一。有一天,她在调试设备时出现故障,拆开继电器后,发现有只飞蛾被夹扁在触点中间,从而“卡”住了机器的运行。于是,霍珀诙谐地把程序故障统称为“臭虫(BUG)”,把排除程序故障叫DEBUG,而这奇怪的“称呼”,竟成为后来计算机领域的专业行话。如DOS系统中的调试程序,程序名称就叫DEBUG。DEBU 阅读详情

相关推荐

opencv DebugRelease区别与使用

opencv DebugRelease区别与使用 在vs2017上配置opencv的时候,因为附加依赖时会优先考虑写在前面的库。如果先添加了Release库会导致无法使用Debug库编译。所以在配置的时候一般只添加一个库。 但是如果你想ReleaseDebug库两种库都想使用,可以使用以下方法。就是把两种文件分开,具体用到哪一个库就配置哪个库。 注意:一般文件夹中的排序是opencv_w...

qmq1101的博客 4778

DebugRelease区别

- bin是放最终代码的目录 。 - obj就放中间代码的目录releasedebug是不同的运行方式。 - debug会增加调试代码,方便调试。 - 调试完后,用release版本发布,没有调试代码,减小程序体积,加快执行速度。

不积跬步无以至千里 2万+

IAR中 Debug Release 区别是什么?

这里的“生成调试信息”其实包含了很多关于调试的信息,如果勾选会多出“.pbd”、 “.browse”、 “.linf”等与调试有关的信息。实际项目中,Debug Release两个版本可能还有很多不同的配置,按理说“Options”下面的很多配置都可以不同。还是拿Keil IAR 来说明,源码工程结构都一样,只是配置不一样,简单来说,就是一个“克隆”版本。这里是说的“版本”是指Debug Release中的版本,并不是软件版本或其他什么版本。

qq_43416206的博客 1192

ReleaseDebug区别

ReleaseDebug区别 文章目录ReleaseDebug区别1. debug release 版本有什么不同1.1 在VS中的区别2. gcc 下 release 版本与 debug 版本的控制 1. debug release 版本有什么不同 DebugDebug 通常称为调试版本,通过一系列编译选项的配合,编译的结果通常包含调试信息,而且不做任何优化,以为开发人员提供 ...

一叶知秋的博客 3万+

Debug模式Release模式有什么区别

数据溢出问题,在一个函数中,存在某些从未被使用的变量,且函数内存在数据溢出问题,在Debug模式下可能不会产生问题,因为不会对该变量进行优化,它在栈空间中还是占有几个字节,但Release模式下可能会出问题,Release模式下可能会优化掉此变量,栈空间相应变小,数据溢出就会导致栈内存损坏,有可能会产生奇奇怪怪的错误。对于未初始化的变量,Debug模式下会默认对其进行初始化,而Release模式则不会,所以就有个常见的问题,局部变量未初始化时,Debug模式Release模式表现有所不同。

qq_41854911的博客 2138

Debugrelease模式

在软件开发里,Debug(调试)模式 Release(发布)模式是两种常见的编译配置,它们存在诸多区别,下面从编译优化、调试信息、错误检查、运行速度、内存使用文件大小等方面详细介绍。

yan_lai的博客 1123

Debug Release区别

Debug Release 是 VS 中的两种构建配置,主要区别包括: 代码优化、调试信息、 文件大小、运行速度、 错误处理。Debug 适合开发阶段调试,Release 适合最终发布版本。

qq_48002970的博客 996

VS中debugrelease区别

Debug 版本的存在是为了方便程序员开发调试,性能体积不是它的重点;Release 版本是最终交给用户的程序,性能体积是需要重点优化的两个方面。在开发过程中,我们一般使用 Debug 版本,只有等到开发完成,确认没有任何 Bug 之后,希望交给用户时再生成 Release 版本。性能优化:Debug 模式:通常不进行优化,以方便调试。编译器会生成包含调试信息的二进制文件,以便开发者在调试过程中能够更容易地理解代码、查看变量的值、设置断点等。

qq_38304120的博客 1099

java debug release_DebugRelease区别

VC下DebugRelease区别最近写代码过程中,发现 Debug 下运行正常,Release 下就会出现问题,百思不得其解,而Release 下又无法进行调试,于是只能采用printf方式逐步定位到问题所在处,才发现原来是给定的一个数组未初始化,导致后面处理异常。网上查找了些资料,在这 罗列汇总下,做为备忘~一、Debug Release区别Debug 通常称为调试版本,它包含调试信...

weixin_34570507的博客 864

debugrelease版本的区别

最近写代码过程中,发现 Debug 下运行正常,Release 下就会出现问题,百思不得其解,而Release 下又无法进行调试,于是只能采用printf方式逐步定位到问题所在处,才发现原来是给定的一个数组未初始化,导致后面处理异常。网上查找了些资料,在这 罗列汇总下,做为备忘~  一、Debug Release区别          Debug 通常称为调试版本,它包含调试信息,

前端产品工程师 5651

Release Debug区别

首先再次强调我们做测试时使用的二进制必须是保证所有Test Case 在 Release 版通过。Release Debug版的区别,具体分析如下……生成的代码Debug 版:生成的exe中包含有符号表等信息,因此可以进行调试/跟踪。 Release版:default状态下不包括这些信息。 指令Code系统OS组件都是Release的运行库本身分DebugReleas

AXDC_QA_Team的专栏 2120

Debug Release区别

/* * * *date:2016/10/30 */前言: ·Debug版本可以而Release版不行: 要把RELEASE下的 去除特定链接库 里的选项去掉,release 下需要lib libcmt . ·Release版本可以而Debug版不行: 如:Debug版的"丢失ucrtbased.dll",即使在syswow64中添上、打通Sever口也无济于事, 解决方案:

沁风抿月的博客 619

VS中DebugRelease版本的区别

之前写过一段代码,能在VS2013的Release下运行,但是不能在Debug下运行,所以又深入学习了一番,下面是学到的经验。(橙色表示引用,红色表示重点) VS中的程序有DebugRelease两个版本,其不同之处: 综述: Debug程序通常比Release程序运行的慢,尤其在处理视频方面,Release要比Debug快很多。在我看的资料中,似乎在Release模式下容易...

Cat 4509

debugrelease区别

DebugRelease有什么区别?怎么把Debug转成Release ?1。DebugRelease有什么区别,为什么要使用Release版本!  2。怎么把Debug转成Release  转载:  Debug版本包括调试信息,所以要比Release版本大很多(可能大数百K至数M)。至于是否需要DLL支持,主要看你采用的编译选项。如果是基于ATL的,则DebugRelease版本对DLL的

Jiao2_vc的专栏 1070

vs中debugrelease版本的区别

vs中的程序有debugrelease两个版本,Debug通常称为调试版本,通过一系列编译选项的配合,编译的结果通常包含调试信息,而且不做任何优化,以为开发 人员提供强大的应用程序调试能力。而Release通常称为发布版本,是为用户使用的,一般客户不允许在发布版本上进行调试。所以不保存调试信 息,同时,它往往进行了各种优化,以期达到代码最小速度最优。为用户的使用提供便利。 debug程序通常比...

gaoyi221119的博客 4239

关于DebugRelease区别

本文链接:http://hi.baidu.com/zltpc007/ 本人说明:在该BLOG中,该文也是标注为转载的,但是该BLOG转载时并没有标示出该文章的来源,故偶也无法标出真正的文章出处。于是,抱着对该文作者原创的尊重,偶在转载时只能把转载该文的上一级链接给出来了。以下为原文转载:经常在 CSDN 上看见有人问 Debug 运行正常但 Release 失败的问题。以往的讨论往往是

睡猫的秘密小空间 643

DebugRelease区别

VC下DebugRelease区别 最近写代码过程中,发现 Debug 下运行正常,Release 下就会出现问题,百思不得其解,而Release 下又无法进行调试,于是只能采用printf方式逐步定位到问题所在处,才发现原来是给定的一个数组未初始化,导致后面处理异常。网上查找了些资料,在这 罗列汇总下,做为备忘~ 一、Debug Release区别         Debug 通常称为

一览众山小 529
上一篇: DEBUG和RELEASE 版本差异及调试相关问题:
下一篇: VC调试入门(转)
小水
博客等级 码龄24年 1粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值