单片机开发环境中Release与Debug模式的对比分析

控制/MCU

1823人已加入

描述

单片机的集成开发环境(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通常称为调试版本。通过一系列编译选项的配合,编译的结果通常包含调试信息,而且不希望做优化,便于程序员调试程序。

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

比如: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选项,或运行时间优化改为程序大小优化。

审核编辑:黄飞

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分