当前位置:网站首页>程序调试 - Debug/Release 版本
程序调试 - Debug/Release 版本
2022-06-29 06:41:00 【qazw9600】
说明
- 在多年的嵌入式研发工作中,发现大部分中小公司都没有划分Debug/Release版本的习惯,即使是一些自誉业内翘楚以及大公司出来的创业团队。
- 常见处理:
- 整个研发阶段只有一种版本,几乎不使用额外工具,调试等通过打印而不使用gdb等工具。
- 编程调试时使用带调试信息的版本,正式版本在此基础上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
边栏推荐
- Markdown skill tree (7): separator and reference
- Appium automation test foundation ADB common commands (II)
- Vulnhub's DC8 target
- 道闸控制器通讯协议
- tf.to_int64
- 4年工作经验,多线程间的5种通信方式都说不出来,你敢信?
- Loop nesting: why can large loops inside and small loops outside improve the running efficiency of programs
- Oracle batch insert data - insert ethnic data
- 【深度之眼吴恩达机器学习作业班第四期】Linear Regression with One Variable,单变量线性回归
- Fluent imitates uiswitch
猜你喜欢

手把手系列---安装SpotBugs、并快速上手使用

ShapeShifter: Robust Physical Adversarial Attack on Faster R-CNN Object Detector
![[FreeRTOS] interrupt mechanism](/img/ab/9b1d07048b4631d7cc95db99ed529a.png)
[FreeRTOS] interrupt mechanism

【工控老马】PLC六路抢答器系统设计详解

Explanation of swing transformer theory

100 lectures on Excel advanced drawing skills (VI) - practical application cases of Gantt chart in project progress

pycharm的虚拟环境如何共享到jupyter-lab

Wechat applet learning notes (summer vacation)

【工控老马】洗衣机PLC程序控制系统设计详解

4年工作经验,多线程间的5种通信方式都说不出来,你敢信?
随机推荐
路由详解(九阳真经)
从Nacos客户端谈Nacos配置中心
【域渗透提权】CVE-2020-1472 NetLogon 权限提升漏洞
施努卡:轮胎自动抓取安装,3D视觉定位,机器人自动抓取
Compiling principle: the king's way
Appium automation test foundation ADB common commands (III)
How to solve the cross domain problem of mobile phone accessing the web in the web development scenario
Software testing
打包时提示: Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘
Concurrent idempotent anti shake
编译原理王者之路
帆船动力学仿真分析
pycharm的虚拟环境如何共享到jupyter-lab
DataTables screen error Popup
Appium自动化测试基础 — ADB常用命令(二)
【工控老马】PLC六路抢答器系统设计详解
Cv:: mat and Base64 conversion (including picture compression and decompression)
100 lectures on Excel advanced drawing skills (VI) - practical application cases of Gantt chart in project progress
Schnuka: 3D machine vision inspection system 3D vision inspection application industry
循环嵌套问题:为什么大循环在内,小循环在外可以提高程序的运行效率