单片机的集成开发环境(IDE)大部分都支持多目标工程,比如:我们熟知的Keil、 IAR都可以创建多目标工程。 为了方便开发者,一些IDE会默认创建 Release和Debug 两个目标工程。 今天就来讲讲瑞萨e2 studio集成开发环境Release和Debug的差异。
下面以RA6M4系列MCU为例,介绍其差异
在IDE e2 studio开发环境下,新建工程默认为debug版本
也可以右击项目工程,切换到release版本
那么问题来了,debug和release版本有什么区别呢?
这个细节往往容易被忽视。在现场技术支持时也经常会发现,在没有弄清楚区别的情况下,容易导致出现错误。
比如使用debug版本产生的bin文件提交测试。程序中有很多方便调试用的ASSERT()函数。此函数编译时可能会包含文件夹绝对路径信息,导致在不同的电脑上编译后,产生bin文件不同。从而引起测试和生产程序管理的混乱。
01
Debug和Release版本有什么不同
Debug:Debug通常称为调试版本。通过一系列编译选项的配合,编译的结果通常包含调试信息,而且不希望做优化,便于程序员调试程序。
Release:Release通常称为发布版本。是为量产做准备的。一般客户不允许在发布版本上进行调试。所以不保存调试信息,同时,它往往进行了各种优化,以期达到代码最小和速度最优。
比如:release版本选择optimization level: Optimize more(-O2)
比如:Debug版本选择optimization level: Optimize for debug(-Og)
实际上,Debug和Release并没有本质的界限,他们只是一组编译选项的集合,编译器只是按照预定的选项行动。事实上,我们甚至可以修改这些选项,从而得到优化过的调试版本或是带跟踪语句的发布版本。
02
预处理
Debug版本通常会有“DEBUG”相关的预处理(宏定义)
_DEBUG与NDEBUG
如下图,经常使用调试宏定义:
比如常见的printf(打印信息),会通过“DEBUG”调试信息打开/关闭打印输出信息。
类似的,ASSERT断言,也是通过宏定义来打开/关闭。
当定义了_DEBUG时,assert()函数会被编译,而NDEBUG时不被编译。
大多数断言都只在Debug版中才会被编译,而在Release版中被忽略。唯一的例外是VERIFY()。事实上,这些宏都是调用assert()函数,只不过附加了一些与库有关的调试代码。如果你在这些宏中加入了任何程序代码,而不只是布尔表达式(例如赋值、能改变变量值的函数调用等),那么 Release 版都不会执行这些操作,从而造成错误。
调试后,可以通过在包含#include的语句之前插入#define ndebug来禁用断言调用。
03
怎样"调试" Release版的程序
遇到Debug成功但Release失败,显然是一件很沮丧的事,而且往往无从下手。如果你看了以上的分析,结合错误的具体表现,很快找出了错误,固然很好。但如果一时找不出,以下给出了一些策略:
前面已经提过,Debug和Release只是一组编译选项的差别,本质上很难区分差别。我们可以修改Release版的编译选项来缩小错误范围。如上所述,可以把Release的选项逐个改为与之相对的Debug选项,或运行时间优化改为程序大小优化。
审核编辑:黄飞
评论
查看更多