程序调试 - Debug/Release 版本

本文探讨了C/C++项目中Debug和Release版本的重要性,指出大部分中小公司忽视这一区分。Debug版本便于调试,包含调试信息,而Release版本注重性能优化,可能涉及strip操作。作者强调,尽管strip可以减小文件大小,但并未消除所有调试手段,如断言,这在Release版本中是潜在风险。建议在编程时明确区分Debug和Release版本,如通过NDEBUG宏进行控制。
摘要由CSDN通过智能技术生成

说明

  • 在多年的嵌入式研发工作中,发现大部分中小公司都没有划分Debug/Release版本的习惯,即使是一些自誉业内翘楚以及大公司出来的创业团队。
  • 常见处理:
  1. 整个研发阶段只有一种版本,几乎不使用额外工具,调试等通过打印而不使用gdb等工具。
  2. 编程调试时使用带调试信息的版本,正式版本在此基础上strip下。

个人理解

是否需要区分Debug/Release版本

  • Debug(调试阶段)、Release (版本发布阶段),每个程序的生命周期中都有这两个阶段,为了针对性处理,每个程序都应该有两种版本(Debug版本和Release版本),Debug版本为了方便调试和发现问题,需要加入很多额外的调试手段,而Release版本,为了性能和用户体验,需要对程序进行一些优化,例如:去掉Debug阶段的调试手段。
  • 划分成Debug/Release版本并不是C/C++语言的特性;不管使用什么语言编写的程序都有这两个阶段,因此都需要进行区分,但是其它语言(例如:java等)对性能的要求相对并不太高以及编译运行机制与C/C++语言不同以及具有更好的动态性(日志等调试手段可以在运行时进行动态设置)所以Debug/Release版本的划分需求并不像C/C++那么明显。
  • Debug/Release版本的划分并不是一种具体的方法,而是一种可以自定义的策略;并没有规范规定Debug和Release版本该做什么,不该做什么,也并没有一个专门的选项来包揽Debug/Release版本的划分,编译器选项和使用IDE可以生成附带调试信息的版本,那是语言层级的Debug/Release版本划分,还需要有业务层的Debug/Release版本划分,例如:Debug/Release阶段不同的Log输出。

strip 和 Release的区别

  • 将附带调试信息的程序strip并不等同于Release版本,编译器加上-g等编译选项编译出来的程序会自带调试信息,strip程序会去掉程序自带的调试信息和符号表,虽然两种方式生成的二进制程序strip后文件大小相同,但是生成的是语言层的Release版本,业务层的调试手段依然存在,例如:断言,自己加的调试手段,并且这些手段(断言)的存在是非常危险的。

C/C++编程时如何划分Debug/Release版本

  • 使用NDEBUG宏,默认情况下未定义该宏,对应Debug版本,生成Release版本时,需要手动定义该宏,该宏还可以控制断言等系统层次的调试手段。
  • 该方式是C/C++项目中约定俗成的划分方式,很多系统代码以及开源项目都是采用该方式,因此在代码中可以判断宏NDEBUG是否存在来判断是Release模式还是Debug模式,或者进行扩展,例如:
#ifndef NDEBUG
    std::cout << "Debug Mode" << std::endl;
#else
    std::cout << "Release Mode" << std::endl;
#endif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值