ubuntu环境下调试 RT-Thread
调试 RT-Thread
下载源码
github 搜索 RT-Thread 下载源码
安装 python scons 环境
你已经安装了 kconfiglib
,但 scons --menuconfig
仍然提示找不到它。这种情况通常是由于 Python 环境不一致 导致的:你在一个 Python 环境中安装了 kconfiglib
,但 scons
运行时使用的是另一个 Python 解释器。
解决思路如下:
✅ 确认当前环境 Python 路径
在你已经激活的 rtenv
环境中,运行:
which python
然后也运行:
which scons
这两个命令的输出路径应该都指向你的虚拟环境路径(~/Code/RTOS/rt-thread/rtenv/
下)。
✅ 确认 scons 使用的 Python
有些系统上的 scons
是全局安装的,用的是系统的 Python,而不是你的虚拟环境中的。
你可以通过下面命令检查 scons
实际使用的是哪个 Python:
scons --version
然后运行:
head -n 1 $(which scons)
查看 scons
的 shebang 行,确认它使用的 Python 是你的虚拟环境中的,比如应为:
#!/home/link/Code/RTOS/rt-thread/rtenv/bin/python
如果不是,那你运行的 scons
用的是系统 Python,自然找不到虚拟环境里的 kconfiglib
。
✅ 解决方案
方法 1:在虚拟环境中安装 scons
确保你在虚拟环境里运行:
pip install scons
然后再运行:
rtenv/bin/scons --menuconfig
或者:
python -m scons --menuconfig
这样能确保 scons
用的是正确的 Python 环境。
✅ 总结
问题的核心是:你安装的
kconfiglib
在虚拟环境中,但运行scons
的 Python 不是那个虚拟环境。
只要确保 scons
是用虚拟环境里的 Python 运行的,问题就能解决。
编译工程
进入 qemu-vexpress-a9 BSP 根目录,然后输入命令 code .
(注意:code 后面有一个点)打开 VS Code,表示使用 VS Code 打开当前目录。
点击 VS Code “查看 -> 终端” 打开 VS Code 内部终端,在终端里输入命令 scons
即可编译工程,终端会打印出编译信息。
修改 VS Code下的 lauch.json
{"version": "0.2.0","configurations": [{"name": "Debug @ Ubuntu with gdb-multiarch","type": "cppdbg","request": "launch","program": "${workspaceFolder}/rtthread.elf","args": [],"stopAtEntry": true,"cwd": "${workspaceFolder}","environment": [],"externalConsole": false,"miDebuggerServerAddress": "localhost:1234","serverLaunchTimeout": 2000,"targetArchitecture": "arm","MIMode": "gdb","miDebuggerPath": "/usr/bin/gdb-multiarch","customLaunchSetupCommands": [],"launchCompleteCommand": "exec-run"}]
}
调试工程
先执行 qemu-vexpress-a9 目录下的 qemu-dbg.sh文件,在 VS Code 里点击调试菜单(小虫子图标),调试平台选择 刚修改的lauch.json,然后按 F5 就可以开启 QEMU 调试模式,断点停留在 main 函数。
在 VS Code 里可以使用 GDB 命令,需要在最前面加上 -exec。 例如 -exec info registers
命令可以查看寄存器的内容:
其他一些主要命令介绍如下所示:
查看内存地址内容:x/<n/f/u> <addr>
,各个参数说明如下所示:
n 是一个正整数,表示需要显示的内存单元的个数,也就是说从当前地址向后显示几个内存单元的内容,一个内存单元的大小由后面的 u 定义
f 表示显示的格式,参见下面。如果地址所指的是字符串,那么格式可以是 s。
其他格式如下表所示:
参数 | 描述 |
---|---|
x | 按十六进制格式显示变量 |
d | 按十进制格式显示变量 |
u | 按十六进制格式显示无符号整型 |
o | 按八进制格式显示变量 |
t | 按二进制格式显示变量 |
a | 按十六进制格式显示变量 |
c | 按字符格式显示变量 |
f | 按浮点数格式显示变量 |
u 表示从当前地址往后请求的字节数,如果不指定的话,GDB 默认是 4 个 bytes。u 参数可以用下面的字符来代替,b 表示单字节,h 表示双字节,w 表示四字 节,g 表示八字节。当我们指定了字节长度后,GDB 会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。
addr 表示一个内存地址。
注:严格区分 n 和 u 的关系,n 表示单元个数,u 表示每个单元的大小。
示例: x/3uh 0x54320 表示从内存地址 0x54320 读取内容,h 表示以双字节为一个单位,3 表示输出三个单位,u 表示按十六进制显示。
查看当前程序栈的内容: x/10x $sp–> 打印 stack 的前 10 个元素
查看当前程序栈的信息: info frame----list general info about the frame
查看当前程序栈的参数: info args—lists arguments to the function
查看当前程序栈的局部变量: info locals—list variables stored in the frame
查看当前寄存器的值:info registers(不包括浮点寄存器) info all-registers(包括浮点寄存器)
查看当前栈帧中的异常处理器:info catch(exception handlers)
提示:输入命令时可以只输入每个命令的第一个字母。例如:info registers 可以只输入 i r。
注:如果在 VS Code 目录中额外添加了文件夹,会导致调试不能够启动。 每次开始调试都需要使用 Env 工具在 BSP 根目录使用code .命令打开 VS Code 才能正常调试工程。
这是个非常常见的问题,简洁总结:
你在 Bash 脚本中使用
source
激活环境变量(如 Python 虚拟环境或env.sh
),这些变量只对当前脚本生效,不会影响你在终端中的父 shell 环境。
🔍 举个例子:
假设你这样写一个脚本 env_setup.sh
:
#!/bin/bash
source rtenv/bin/activate
source ~/.env/env.sh
你执行它:
./env_setup.sh
你会发现:
- 脚本中的
source
是成功的; - 但脚本一结束,环境变量(如
RTT_ROOT
、PATH、alias、Python venv 等)就“消失”了。
原因是:
脚本在子 shell 中运行,环境变更不会传回你的交互式终端。
✅ 正确方式:用 source
调用脚本
想让环境变量影响当前终端,你必须这样运行你的脚本:
source ./env_setup.sh
# 或
. ./env_setup.sh
这时 env_setup.sh
中的所有 export
、alias
、虚拟环境激活、RTT 工具加载等,才会真正“留在”你的终端环境里。
📌 终极总结:
方式 | 会影响当前终端环境吗? |
---|---|
./script.sh | ❌ 不会(在子 shell 中执行) |
bash script.sh | ❌ 不会 |
source script.sh | ✅ 会 |
. script.sh | ✅ 会(等同于 source ) |
✅ 推荐:在终端初始化中配置
你也可以把这些写入 .bashrc
/ .zshrc
末尾:
alias rtenv='source ~/Code/RTOS/rt-thread/rtenv/bin/activate && source ~/.env/env.sh'
以后只需输入:
rtenv
即可一键进入开发环境。
必须先完成配置和编译,再运行 scons --dist
,否则 scons --dist
会失败或者打包内容不完整。
✅ 正确的使用顺序如下:
- 配置编译环境
export RTT_EXEC_PATH=/usr/bin # 或你的 arm-none-eabi 工具链路径
scons --menuconfig # 生成 .config 和 rtconfig.py
- 编译项目,确保能正常构建
scons # 构建 rt-thread 项目,生成 .elf 等产物
- 打包项目
scons --dist # 在成功构建后打包整个工程为 .zip(含配置、源码、工具)
📦 scons --dist
的作用
该命令会自动打包:
- 当前 BSP 所需文件(包括
SConscript
,board
,applications
,Kconfig
,Makefile
等) .config
,rtconfig.py
等配置文件- 构建产物(如
.elf
,.bin
,.map
) - 导出一个
project.zip
或类似压缩包,便于部署、分发、发布或在 RT-Thread Studio 中导入
🧠 如果你还没配置成功或无法构建成功,建议:
- 不要先
scons --dist
- 否则打的包是不完整的
使用CLion 开发
打包好的dist下的project 可以拷到别处独立运行,注意RTT-ROOT环境变量变化,
修改SCons 文件,屏蔽掉前面几行即可,因为project中已经包含rt-thread了
# if os.getenv('RTT_ROOT'):
# RTT_ROOT = os.getenv('RTT_ROOT')
# else:
# RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..')# set RTT_ROOT
if not os.getenv("RTT_ROOT"): RTT_ROOT="rt-thread"
再次执行 scons --target=cmake
生成cmake.txt,即可使用CLION开发。