Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Debug
SCons
编译
经验分享:RT-Thread SCons编译不稳定问题debug总结
10.00
发布于 2022-09-17 17:52:49 浏览:2032
订阅该版
# 摘要 在使用RT-Thread的过程中,发现RT-Thread SCons存在编译不稳定的问题。在源文件相同的情况下连续编译,相邻两次生成的map文件和bin文件差异巨大、运行效果不同,不利于版本回溯和管理。 本文主要总结了跟踪解决编译不稳定的问题的过程、经验、及Debug小技巧。 [TOC] # 正文 # 1. 怎么发现编译不稳定问题的? ## (1) Test1:发现同样的源代码编译生成的hex大小有差异。 1) 在代码里多加一个int型变量,想观察新增变量对编译结果生成的text、data、bss、dec大小的影响,发现增加int变量前后观察到的现象与我理论分析的值不一样。 2) 不改动代码,连续编译,发现在不改动源代码的情况下,编译生成的text、data、bss、dec大小也会有小幅度的变化。 3) 因为代码能运行,不受编译结果的影响,所以决定暂不深入追究。 ## (2) Test2:发现同样的源代码生成的BIN文件内容不同、运行结果不同,有的会卡死有的不会。 1) 过了一段时间后,有一次,调试过程中发现代码卡死了,边改边调发现同样的代码有的时候能运行正常,有的时候会挂死。 2) 联想到之前遇到一个问题:在编译优化等级为O3时会挂死,在编译优化等级为O1时能正常运行。 3) 连着编译了4次,将4次编译生成的BIN文件存下来,分别烧录测试,就发现了会跑挂的BIN文件每次都会跑挂,不会挂的BIN文件每次都不会跑挂。 4) 用文件对比工具对比两个BIN文件,发现有5000+的差异点; # 2. 为什么有必要解决编译不稳定问题? 同样的源代码,编译后生成了内容差异巨大、运行结果不同的BIN文件,相当于在编译过程中引入了随机变量,随机的BIN文件不利于版本管理、压测,也不利于用控制变量法解决发现的BUG(因为编译引入了新的变量)。 很明显,跟踪解决这个问题有利于保证软件质量,提高往后的调测效率。 # 3. 编译不稳定问题的根本原因及解决方案? ## (1) 根本原因: SCons构建工具进行链接前会从文件系统中收集编译生成的目标文件(*.o, objects files)得到一个objects list。由于文件系统返回文件的顺序具有随机性,所以objects list中的目标文件排序具有随机性,导致最终链接出来的map文件具有随机性。 ## (2) 解决方案: 在SCons收集到objects list后,在objects list被转化为targe文件之前,对objects进行排序,排序顺序是sort函数的默认排序顺序。测试验证得,这样排序后编译正常、编译结果稳定、运行结果稳定,可作为[解决方案。](https://github.com/RT-Thread/rt-thread/pull/6411/files) # 4. 编译tricks总结: ## (1) 关于SCons指令的注意事项及几个有助于调试的指令: 一般使用指令的时候都会去找到官方的指令手册,然后对照着指令手册查自己想要的指令。但在RT-Thread里使用SCons指令时,不能完全参照SCons官网的手册,因为RT-Thread移植的SCons代码里对官方的源码做了封装,有的时候直接用官方指令是得不到官方文档所描述的指令效果的。RT-Thread的官方文档里最像指令手册的文档…目前只找到了[RT-Thread工具手册](https://www.mianshigee.com/tutorial/RT-Thread-tool/3.md),具体都有什么指令还需要结合RT-Thread的env源代码进行探索。 1. 指令1,控制输出完整的编译指令 SCons -Q SCons --verbose 参考链接:[RT-Thread工具手册](https://www.mianshigee.com/tutorial/RT-Thread-tool/3.md), [SCons user guide:2.6](https://SCons.org/doc/production/HTML/SCons-user/ch02s06.html), [SCons user guide:9.2](https://SCons.org/doc/production/HTML/SCons-user/ch09s02.html) 2. 指令2,控制输出一些调试解释信息 SCons --debug=explain 参考连接:[SCons user guide:6.5](https://SCons.org/doc/production/HTML/SCons-user/ch10.html) 3. 指令3,控制多线程编译(N为CPU核数) SCons -jN 参考连接:[RT-Thread工具手册](https://www.mianshigee.com/tutorial/RT-Thread-tool/3.md),[SCons user guide 10.1.3](https://SCons.org/doc/production/HTML/SCons-user/ch10.html) ## (2) 可从map文件分析得到*.o文件大小的工具: https://github.com/adafruit/linker-map-summary ## (3) Linux脚本与window脚本的一个区别: Linux下的脚本是*.sh,window下的脚本是*.bat,*.sh只需比*.bat在开头加一行 \#!/bin/bash ## (4) 两个可以提效的gcc编译选项: 打开gcc所有的warning信息输出:CFLAG = -Wall 打开gcc warning信息的颜色:DFLAG = -fdiagnostics-color=always # 参考链接 [RT-Thread4.1.0工程用scons连续编译生成的map文件差异很大](https://club.rt-thread.org/ask/question/d457e7c1e0aa43cd.html) [Get the most out of the linker map file](https://interrupt.memfault.com/authors/cyril/) [Cyril Fougeray's Blog](https://www.cyrilfougeray.com/blog/) [GCC编译优化系列-前后编译的两个版本固件bin大小不一样,怎么办](https://club.rt-thread.org/ask/article/f33b580e5cfc7923.html) [https://reproducible-builds.org/docs/stable-inputs/](https://reproducible-builds.org/docs/stable-inputs/) [https://github.com/RT-Thread/rt-thread/pull/6411/files](https://github.com/RT-Thread/rt-thread/pull/6411/files) [https://github.com/RT-Thread/rt-thread/issues/6388](https://github.com/RT-Thread/rt-thread/issues/6388)
11
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
childerxxx
这家伙很懒,什么也没写!
文章
1
回答
6
被采纳
0
关注TA
发私信
相关文章
1
scons不支持python3吗?
2
编译又出现问题
3
BSP目录下做好一个项目后,怎么把发给别人的包裁剪的小...
4
为什么重新scons --target=mdk 后,以前在MDK工程里保存的C文
5
Scons 添加Group,SConscript已经执行,源码却没有添加进工程
6
scons如何指定输出目录?
7
新人求助。
8
想用env 工具自己构建编译环境想用vscode 进行一些简单程序
9
关于scons脚本问题
10
使用scons --target=makefile的问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
线程
RT-Thread Nano
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
SFUD
msh
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1443
个答案
289
次被采纳
张世争
807
个答案
174
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
4
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部