很多软件集成开发环境(IDE),比如VS(VC)、IAR等,在创建工程时都会自动生成有Debug 和 Release两个版本。这两个版本什么意思呢?一个用于调试Debug,一个用于发布Release。那么是不是很多伙计都是debug版本用到老?那么今天聊聊Release的必要性吧。
两个版本的通用解读在大型嵌入式应用软件开发中,如linux应用程序,这两个版本类型主要针对软件开发在不同阶段的构建过程的一些优化和设置,当然这些优化设置也是可以更改的。Debug版本主要是于开发和调试阶段,你所编写的软件通常被编译为未经优化的代码,以便于调试和排查。编译器会保留大量的符号信息、调试信息和原始代码结构,以便于在调试器中查看变量、函数调用栈等详细信息,有助于开发人员快速定位和解决问题。而对于release版本,经过了各种优化,以提高代码的执行效率和减小代码体积,比如去除未使用的代码、内联函数、循环展开、常量传播等,这样会使得程序具有较高的性能和较小的内存占用,适合于在实际运行环境中使用,但这也会大大削减一些调试信息和辅助检查。在大型OS上运行的应用程序所使用的两个版本均有如上特点,但对于单片机固件却有所差异,但也非常相似。单片机两种版本的特殊对于单片机软件系统中,这两个版本上的配置相对比较单纯点,主要是如下三个方面。1、优化级别Debug版本通常使用较低的优化级别,例如-Og(优化以便调试),以便在调试过程中能够更好地观察变量的值和程序的执行流程。这种优化级别保留了较多的符号信息和原始代码结构,有利于开发人员进行实时调试和故障排除。Release版本则会使用更高的优化级别,例如-O2或者-O3(最大优化级别),以提升代码的运行效率和固件的性能。高优化级别会进行函数内联、循环展开、删除未使用的代码路径等操作,当然你也可以更细粒度的进行优化项目的设置,从而最大程度地优化代码的执行速度和资源利用率,但也会在一定程度上干扰开发软件对于程序与执行过程的对应分析。2、调试信息输出Debug版本通常会让程序中较多的debug_printf生效,这些打印调试信息不仅仅有第三方组件,还有一些自定义的调试信息,这样可以在一定程度上让开发人员更加直观的了解程序运行流程和结果,但也同时会导致程序执行负荷较高,体积变大。4、安全检查和错误处理基本上也就是我们说的断言了,其实它就是在程序运行时检查程序中的某个条件是否满足预期,如果条件不满足,则程序会进入一个错误处理流程,通常是通过打印错误信息并可能进行一些清理工作后停止运行,如下代码示例:#include "stdio.h"
#ifdef NDEBUG
#define ASSERT(expr) ((void)0)
#else
#define ASSERT(expr) ((expr) ? (void)0 : assert_fail( __FILE__, __LINE__ ))
#endif
void assert_fail(const char* file, int line) {
printf("Assert failed at %s, line %d\n", file, line);
while (1); // 可以添加清理代码,例如锁定资源,然后停止执行
}
int main() {
int x = -1;
ASSERT(x > 0); // 这里的断言会失败,会调用assert_fail函数
return 0;
}所以当断言较多的时候,每个函数基本上都会对输入进行检查,执行效率可想而知。
两个版本的必要性一般的公司基本上都只有一个debug版本,特别是单片机固件开发的项目更为突出。当然为了减少开发周期、又想保证产品功能的稳定性,处理器相对裕量较大,一直使用debug版本也不是不行,毕竟很多公司这些年就这么过来的,总比有些工程代码编译出来的release直接就飞了,还不知道怎么飞的好太多了,公司产品又急着上线,客户又要求快速解决,确实不容易;debug版本丢到现场,出了问题有日志,日复一日,终可修护稳定。不过从开发角度两个版本还是非常有必要的~release执行效率的提高、代码固件的压缩能够进一步降低核心主控的成本,同样对于执行效率敏感和内存资源受限的平台还是非常有用的,而且专业软件公司都会有单元测试与集成测试的开发与使用过程,release软件的稳定性能够得到较好的测试保障。同时debug版本通常比release版本更容易被反向工程,debug版本保留了大量的符号信息、调试信息以及原始代码结构,这些信息对于逆向工程者来说提供了更多的线索和可操作性。而且你打印了较多的调试信息,对于友商开发工程师而言也是很好的参考资料,相关功能也推敲个七七八八。当然话说回来,如果所开发的产品都是定制的话,并不需要去市场上争蛋糕,其实这块优势也会弱化。所以在软件稳定并且即将部署到目标设备时,尽量切换到Release版本,值得注意的是这里的release不是你测都没测,直接切换选项卡生成的版本,而是稳定发布版。正确选择和管理Debug版本和Release版本,能够有效地支持整个嵌入式软件开发生命周期的各个阶段。 |