RV1126B 交叉编译与远程调试方案
适用平台:Ubuntu PC(宿主机) + RV1126B 开发板(目标板)
连接方式:网络连接
构建方式:CMake
调试方式:VSCode 图形化远程调试(gdbserver + gdb-multiarch)
一、开发环境准备
1.1 Ubuntu PC 端环境安装
bash
# 更新软件源
sudo apt update
# 安装 aarch64 交叉编译工具链
sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
# 安装 CMake 构建工具
sudo apt install cmake
# 安装多架构 GDB(用于远程调试)
sudo apt install gdb-multiarch
# 验证安装
aarch64-linux-gnu-gcc --version
aarch64-linux-gnu-g++ --version
cmake --version
gdb-multiarch --version
注:若瑞芯微 RV1126B SDK 提供专属交叉工具链(通常位于 SDK 的
prebuilts/gcc/linux-x86/aarch64/目录),优先使用 SDK 工具链,以确保工具链 glibc 版本与板端运行环境匹配。
1.2 RV1126B 开发板端环境准备
bash
# 板端安装 gdbserver(若 buildroot 系统未预装)
# 方式1:apt 安装(Debian/Ubuntu 系统)
apt update && apt install gdbserver
# 方式2:buildroot 系统需在 make menuconfig 中勾选
# Target packages → Debugging, profiling and benchmark → gdbserver
# 验证
gdbserver --version
1.3 网络连接配置
1. 板端网络配置
通过串口或 USB-ADB 进入板端 shell,配置网络:
bash
# 板端查看网络接口
ifconfig
# 配置静态 IP(假设使用 eth0)
ifconfig eth0 192.168.1.100 netmask 255.255.255.0
# 测试与 PC 的网络连通性(PC IP 假设为 192.168.1.10)
ping 192.168.1.10
2. PC 端网络验证
bash
# PC 端验证与板端的连通性
ping 192.168.1.100
# 确保 SSH 服务可用(便于文件传输与远程命令执行)
ssh root@192.168.1.100
3. 板端开启 SSH 服务(推荐,便于后续部署)
bash
# 板端启动 sshd
/etc/init.d/ssh start
# 或
systemctl start sshd
二、交叉编译配置(CMake 方式)
2.1 项目目录结构
media_terminal/
├── CMakeLists.txt
├── toolchain-aarch64.cmake # 交叉编译工具链配置
├── src/
│ ├── main.cpp
│ ├── video/
│ │ ├── video.cpp
│ │ └── video.h
│ ├── audio/
│ │ ├── audio.cpp
│ │ └── audio.h
│ └── storage/
│ ├── storage.cpp
│ └── storage.h
└── build/ # 构建输出目录
2.2 交叉编译工具链配置文件
创建 toolchain-aarch64.cmake:
cmake
# 交叉编译工具链配置 - RV1126B (aarch64)
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
# 指定交叉编译器
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)
# 设置交叉编译查找路径
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
2.3 CMakeLists.txt 配置
cmake
cmake_minimum_required(VERSION 3.10)
project(media_terminal CXX C)
# C++ 标准配置(C++17,向下兼容 C++11)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# 调试选项(带调试符号,调试阶段关闭优化)
set(CMAKE_CXX_FLAGS_DEBUG "-g -O0 -Wall")
set(CMAKE_CXX_FLAGS_RELEASE "-O2 -Wall")
# 源文件
set(SRCS
src/main.cpp
src/video/video.cpp
src/audio/audio.cpp
src/storage/storage.cpp
)
# 可执行目标
add_executable(${PROJECT_NAME} ${SRCS})
# 头文件包含路径
target_include_directories(${PROJECT_NAME} PRIVATE
src
src/video
src/audio
src/storage
)
# 链接库
target_link_libraries(${PROJECT_NAME}
pthread
# 其他依赖库按需添加
)
2.4 构建命令
bash
# 进入项目根目录
cd media_terminal
# 创建并进入构建目录
mkdir -p build && cd build
# 配置(指定工具链文件与构建类型为 Debug)
cmake -DCMAKE_TOOLCHAIN_FILE=../toolchain-aarch64.cmake \
-DCMAKE_BUILD_TYPE=Debug \
..
# 编译
make -j$(nproc)
# 验证生成的可执行文件架构
file media_terminal
# 预期输出包含:ELF 64-bit LSB executable, ARM aarch64
三、部署到开发板
3.1 通过 SCP 传输可执行文件
bash
# 在 PC 端执行,将编译产物传输到板端
scp media_terminal root@192.168.1.100:/usr/bin/
# 赋予执行权限(通过 SSH 远程执行)
ssh root@192.168.1.100 "chmod +x /usr/bin/media_terminal"
3.2 通过 NFS 共享目录(推荐,适合频繁调试)
1. PC 端配置 NFS 共享
bash
# 安装 NFS 服务
sudo apt install nfs-kernel-server
# 创建共享目录
mkdir -p /home/user/nfs_share
sudo chmod 777 /home/user/nfs_share
# 配置共享(PC IP 假设为 192.168.1.10)
echo "/home/user/nfs_share 192.168.1.100(rw,sync,no_root_squash,no_subtree_check)" | sudo tee -a /etc/exports
# 重启 NFS 服务
sudo systemctl restart nfs-kernel-server
2. 将编译产物拷贝至共享目录
bash
cp build/media_terminal /home/user/nfs_share/
3. 板端挂载 NFS 共享目录
bash
# 板端执行挂载
mkdir -p /mnt/nfs
mount -t nfs -o nolock 192.168.1.10:/home/user/nfs_share /mnt/nfs
# 验证
ls /mnt/nfs/media_terminal
优势:PC 端重新编译后直接拷贝到共享目录,板端无需重复传输,直接运行最新版本。
四、VSCode 图形化远程调试
4.1 VSCode 插件安装
在 VSCode 中安装以下插件:
- C/C++(Microsoft 提供,必需)
- CMake Tools(可选,便于 CMake 工程管理)
4.2 VSCode 工作区配置
在项目根目录下创建 .vscode 目录,包含以下配置文件:
1. tasks.json - 构建任务
json
{
"version": "2.0.0",
"tasks": [
{
"label": "CMake Build (Cross Compile)",
"type": "shell",
"command": "cmake --build build",
"group": {
"kind": "build",
"isDefault": true
},
"problemMatcher": ["$gcc"]
},
{
"label": "Deploy to Board (SCP)",
"type": "shell",
"command": "scp build/media_terminal root@192.168.1.100:/usr/bin/",
"dependsOn": "CMake Build (Cross Compile)",
"problemMatcher": []
}
]
}
2. launch.json - 调试配置
json
{
"version": "0.2.0",
"configurations": [
{
"name": "Remote Debug (RV1126B)",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/media_terminal",
"args": [],
"stopAtEntry": false,
"cwd": "/usr/bin",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "gdb-multiarch",
"miDebuggerServerAddress": "192.168.1.100:1234",
"setupCommands": [
{ "text": "set architecture aarch64" },
{ "text": "set print pretty on" },
{ "text": "set print object on" }
]
}
]
}
4.3 调试操作流程
步骤 1:PC 端交叉编译(带调试符号)
bash
# 确保 CMakeLists.txt 中构建类型为 Debug(-g -O0)
cd build
cmake -DCMAKE_TOOLCHAIN_FILE=../toolchain-aarch64.cmake -DCMAKE_BUILD_TYPE=Debug ..
make -j$(nproc)
或在 VSCode 中执行任务 CMake Build (Cross Compile)。
步骤 2:部署到板端
bash
# 通过 SCP 传输
scp build/media_terminal root@192.168.1.100:/usr/bin/
# 或使用 NFS 共享(板端直接访问 /mnt/nfs/media_terminal)
或在 VSCode 中执行任务 Deploy to Board (SCP)。
步骤 3:板端启动 gdbserver
bash
# SSH 登录板端
ssh root@192.168.1.100
# 启动 gdbserver,监听 1234 端口并加载待调试程序
gdbserver :1234 /usr/bin/media_terminal
# 输出示例:
# Process /usr/bin/media_terminal created; pid = 1234
# Listening on port 1234
若需附加到已运行的进程:
bashgdbserver :1234 --attach <PID>
步骤 4:PC 端 VSCode 启动调试
- 在源代码中设置断点(点击行号左侧)
- 按
F5启动调试配置Remote Debug (RV1126B) - VSCode 自动通过
gdb-multiarch连接到板端192.168.1.100:1234 - 调试器停在程序入口或断点处
步骤 5:调试操作
| 操作 | 快捷键 | 说明 |
|---|---|---|
| 继续 | F5 | 运行至下一断点 |
| 单步跳过 | F10 | 不进入函数内部 |
| 单步进入 | F11 | 进入函数内部 |
| 单步跳出 | Shift+F11 | 跳出当前函数 |
| 重启 | Ctrl+Shift+F5 | 重新启动调试 |
| 停止 | Shift+F5 | 停止调试 |
调试过程中可使用以下功能:
- 变量查看:左侧"变量"面板查看局部变量
- 监视:添加表达式实时监视
- 调用堆栈:查看函数调用链
- 断点管理:条件断点、日志断点等
4.4 调试结束与板端清理
bash
# 板端 gdbserver 会在调试结束后自动退出
# 若需手动终止
killall gdbserver
# 确保端口释放
netstat -tlnp | grep 1234
五、完整工作流总结
┌─────────────────────────────────────────────────────────────┐
│ Ubuntu PC(宿主机) │
│ │
│ 1. 编写源代码 (C++17) │
│ ↓ │
│ 2. CMake 交叉编译 (aarch64-linux-gnu-g++) │
│ ↓ │
│ 3. 生成带调试符号的 ELF 可执行文件 (-g -O0) │
│ ↓ │
│ 4. SCP / NFS 部署到板端 │
│ ↓ │
│ 5. VSCode + gdb-multiarch 连接板端 gdbserver │
│ ↓ │
│ 6. 图形化调试(断点/单步/变量查看) │
│ │
└────────────────────────────┬────────────────────────────────┘
│ 网络 (TCP/IP)
↓
┌─────────────────────────────────────────────────────────────┐
│ RV1126B 开发板(目标板) │
│ │
│ 1. 网络连通 (192.168.1.100) │
│ 2. 接收部署的可执行文件 │
│ 3. 启动 gdbserver 监听 1234 端口 │
│ 4. 运行被调试程序,等待 PC 端连接 │
│ │
└─────────────────────────────────────────────────────────────┘
六、关键注意事项
| 事项 | 说明 |
|---|---|
| glibc 版本匹配 | 交叉工具链的 glibc 版本必须 ≤ 板端 glibc 版本,否则运行报错。建议用 SDK 自带工具链 |
| 调试符号 | 编译时加 -g -O0(调试)或 -g -O2(带优化调试) |
| 库依赖 | 用 aarch64-linux-gnu-readelf -d media_terminal 查看依赖库,确保板端存在对应 .so |
| 时间同步 | 板端若无 RTC 电池,每次启动时间需同步,否则录像文件命名时间错误 |
| 防火墙 | 调试时确保 PC 与板端网络互通,端口 1234 未被拦截 |
七、常见问题排查
7.1 运行时报 "No such file or directory"
原因:工具链 glibc 版本高于板端 glibc 版本。
解决:
bash
# 检查程序依赖的动态库
aarch64-linux-gnu-readelf -d media_terminal | grep NEEDED
# 板端检查 glibc 版本
ldd --version
# 使用 SDK 自带工具链重新编译,或静态链接
7.2 gdbserver 连接失败
排查步骤:
bash
# 板端检查 gdbserver 是否运行
ps | grep gdbserver
# 板端检查端口是否监听
netstat -tlnp | grep 1234
# PC 端检查网络连通性
ping 192.168.1.100
# PC 端检查端口是否可达
telnet 192.168.1.100 1234
# 检查防火墙是否拦截
sudo ufw status
7.3 调试时无法查看源代码
原因 :PC 端可执行文件路径与 launch.json 中 program 字段不匹配。
解决 :确保 launch.json 中 program 指向 PC 端带调试符号的可执行文件路径(非板端路径)。
7.4 断点不生效
原因:编译优化导致代码行与机器指令不对应。
解决:
cmake
# 确保使用 Debug 构建类型
set(CMAKE_BUILD_TYPE Debug)
set(CMAKE_CXX_FLAGS_DEBUG "-g -O0")
7.5 NFS 挂载失败
bash
# PC 端检查 NFS 服务状态
sudo systemctl status nfs-kernel-server
# 检查导出列表
exportfs -v
# 板端检查挂载错误
mount -t nfs -o nolock 192.168.1.10:/home/user/nfs_share /mnt/nfs -v
八、配置文件汇总
| 文件 | 位置 | 作用 |
|---|---|---|
toolchain-aarch64.cmake |
项目根目录 | CMake 交叉编译工具链配置 |
CMakeLists.txt |
项目根目录 | CMake 构建配置 |
.vscode/tasks.json |
.vscode/ |
VSCode 构建与部署任务 |
.vscode/launch.json |
.vscode/ |
VSCode 远程调试配置 |
九、网络环境配置参数表
| 参数 | PC 端(Ubuntu) | 板端(RV1126B) |
|---|---|---|
| IP 地址 | 192.168.1.10 | 192.168.1.100 |
| 子网掩码 | 255.255.255.0 | 255.255.255.0 |
| 调试端口 | - | 1234(gdbserver) |
| SSH 端口 | 22 | 22 |
| NFS 共享路径 | /home/user/nfs_share | /mnt/nfs(挂载点) |