2026 / 07 / 22
Release和Debug版本的差异

小伙伴们在使用瑞萨e2 studio集成开发环境创建工程时,经常看到会自动生成debug和release两个版本配置。


下面以RA6M4系列MCU为例,介绍其差异

在IDE estudio开发环境下,新建工程默认为debug版本


也可以右击项目工程,切换到release版本



那么问题来了,debug和release版本有什么区别呢?

这个细节往往容易被忽视。在现场技术支持时也经常会发现,在没有弄清楚区别的情况下,容易导致出现错误。


比如使用debug版本产生的bin文件提交测试。程序中有很多方便调试用的ASSERT()函数。此函数编译时可能会包含文件夹绝对路径信息,导致在不同的电脑上编译后,产生bin文件不同。从而引起测试和生产程序管理的混乱。


1 Debug和Release版本有什么不同

Debug:Debug通常称为调试版本。通过一系列编译选项的配合,编译的结果通常包含调试信息,而且不希望做优化,便于程序员调试程序。


Release
Release通常称为发布版本。是为量产做准备的。一般客户不允许在发布版本上进行调试。所以不保存调试信息,同时,它往往进行了各种优化,以期达到代码最小和速度最优。


比如:release版本选择optimization level: Optimize more(-O2)


比如:Debug版本选择optimization level: Optimize for debug(-Og)


实际上,Debug和Release并没有本质的界限,他们只是一组编译选项的集合,编译器只是按照预定的选项行动。事实上,我们甚至可以修改这些选项,从而得到优化过的调试版本或是带跟踪语句的发布版本。


2 预处理

Debug版本通常会有“DEBUG”相关的预处理(宏定义)


_DEBUG与NDEBUG


如下图,经常使用调试宏定义:


比如常见的printf(打印信息),会通过“DEBUG”调试信息打开/关闭打印输出信息。


类似的,ASSERT断言,也是通过宏定义来打开/关闭。


当定义了_DEBUG时,assert()函数会被编译,而NDEBUG时不被编译。


大多数断言都只在Debug版中才会被编译,而在Release版中被忽略。唯一的例外是VERIFY()。事实上,这些宏都是调用assert()函数,只不过附加了一些与库有关的调试代码。如果你在这些宏中加入了任何程序代码,而不只是布尔表达式(例如赋值、能改变变量值的函数调用等),那么 Release 版都不会执行这些操作,从而造成错误。


调试后,可以通过在包含#include的语句之前插入#define ndebug来禁用断言调用。


3 怎样"调试" Release版的程序

遇到Debug成功但Release失败,显然是一件很沮丧的事,而且往往无从下手。如果你看了以上的分析,结合错误的具体表现,很快找出了错误,固然很好。但如果一时找不出,以下给出了一些策略:


前面已经提过,Debug和Release只是一组编译选项的差别,本质上很难区分差别。我们可以修改Release版的编译选项来缩小错误范围。如上所述,可以把Release的选项逐个改为与之相对的Debug选项,或运行时间优化改为程序大小优化。


本文以estudio为例,在Keil和IAR IDE中也是类似的,会自动生成两个版本,工程配置大同小异。

文件下载
隐私条款

一、接受条款 使用者(也称"您")在访问或使用本网站及其服务时,即已经表示同意并不加修改地接受本《用户协议》、本网站的《隐私声明》、《法律声明》以及其关或相链接的网页和网站的条件和条款的规定。我们强烈建议:在您阅读和接受本《用户协议》时,也应阅读并接受本《用户协议》中所提到《隐私声明》、《法律声明》及其相关或相链接网页或网站所包含的资料,因为《隐私声明》、《法律声明》及其它相关网页或网站可能包含对您适用的进一步规定。(请注意:点击划有底线的词句即可链接到上述《隐私声明》、《法律声明》及其它相关或相链接的网页和网站。

 

二、使用者的资格要求 在本网站中"使用者"指的是浏览、阅读、使用本网站信息或服务的任何个人或组织。本网站的服务仅适用于根据相关法律的规定具有签订有约束力的合同的个人或组织并仅由其使用。本网站的服务不向18周岁以下的个人使用者提供,也不向临时被本网站中止或取消使用者资格的使用者提供。如果使用者不符合本条规定,请停止使用本网站或本网站的服务。

样品
申请

应用
资源

微信