RV1126B交叉编译与远程调试方案

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

若需附加到已运行的进程:

bash 复制代码
gdbserver :1234 --attach <PID>

步骤 4:PC 端 VSCode 启动调试

  1. 在源代码中设置断点(点击行号左侧)
  2. F5 启动调试配置 Remote Debug (RV1126B)
  3. VSCode 自动通过 gdb-multiarch 连接到板端 192.168.1.100:1234
  4. 调试器停在程序入口或断点处

步骤 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.jsonprogram 字段不匹配。

解决 :确保 launch.jsonprogram 指向 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(挂载点)
复制代码