RV1126B交叉编译与远程调试方案 RV1126B 交叉编译与远程调试方案适用平台Ubuntu PC宿主机 RV1126B 开发板目标板连接方式网络连接构建方式CMake调试方式VSCode 图形化远程调试gdbserver gdb-multiarch一、开发环境准备1.1 Ubuntu PC 端环境安装# 更新软件源sudoaptupdate# 安装 aarch64 交叉编译工具链sudoaptinstallgcc-aarch64-linux-gnu g-aarch64-linux-gnu# 安装 CMake 构建工具sudoaptinstallcmake# 安装多架构 GDB用于远程调试sudoaptinstallgdb-multiarch# 验证安装aarch64-linux-gnu-gcc--versionaarch64-linux-gnu-g--versioncmake--versiongdb-multiarch--version注若瑞芯微 RV1126B SDK 提供专属交叉工具链通常位于 SDK 的prebuilts/gcc/linux-x86/aarch64/目录优先使用 SDK 工具链以确保工具链 glibc 版本与板端运行环境匹配。1.2 RV1126B 开发板端环境准备# 板端安装 gdbserver若 buildroot 系统未预装# 方式1apt 安装Debian/Ubuntu 系统aptupdateaptinstallgdbserver# 方式2buildroot 系统需在 make menuconfig 中勾选# Target packages → Debugging, profiling and benchmark → gdbserver# 验证gdbserver--version1.3 网络连接配置1. 板端网络配置通过串口或 USB-ADB 进入板端 shell配置网络# 板端查看网络接口ifconfig# 配置静态 IP假设使用 eth0ifconfigeth0192.168.1.100 netmask255.255.255.0# 测试与 PC 的网络连通性PC IP 假设为 192.168.1.10ping192.168.1.102. PC 端网络验证# PC 端验证与板端的连通性ping192.168.1.100# 确保 SSH 服务可用便于文件传输与远程命令执行sshroot192.168.1.1003. 板端开启 SSH 服务推荐便于后续部署# 板端启动 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# 交叉编译工具链配置 - 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_minimum_required(VERSION 3.10) project(media_terminal CXX C) # C 标准配置C17向下兼容 C11 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 构建命令# 进入项目根目录cdmedia_terminal# 创建并进入构建目录mkdir-pbuildcdbuild# 配置指定工具链文件与构建类型为 Debugcmake-DCMAKE_TOOLCHAIN_FILE../toolchain-aarch64.cmake\-DCMAKE_BUILD_TYPEDebug\..# 编译make-j$(nproc)# 验证生成的可执行文件架构filemedia_terminal# 预期输出包含ELF 64-bit LSB executable, ARM aarch64三、部署到开发板3.1 通过 SCP 传输可执行文件# 在 PC 端执行将编译产物传输到板端scpmedia_terminal root192.168.1.100:/usr/bin/# 赋予执行权限通过 SSH 远程执行sshroot192.168.1.100chmod x /usr/bin/media_terminal3.2 通过 NFS 共享目录推荐适合频繁调试1. PC 端配置 NFS 共享# 安装 NFS 服务sudoaptinstallnfs-kernel-server# 创建共享目录mkdir-p/home/user/nfs_sharesudochmod777/home/user/nfs_share# 配置共享PC IP 假设为 192.168.1.10echo/home/user/nfs_share 192.168.1.100(rw,sync,no_root_squash,no_subtree_check)|sudotee-a/etc/exports# 重启 NFS 服务sudosystemctl restart nfs-kernel-server2. 将编译产物拷贝至共享目录cpbuild/media_terminal /home/user/nfs_share/3. 板端挂载 NFS 共享目录# 板端执行挂载mkdir-p/mnt/nfsmount-tnfs-onolock192.168.1.10:/home/user/nfs_share /mnt/nfs# 验证ls/mnt/nfs/media_terminal优势PC 端重新编译后直接拷贝到共享目录板端无需重复传输直接运行最新版本。四、VSCode 图形化远程调试4.1 VSCode 插件安装在 VSCode 中安装以下插件C/CMicrosoft 提供必需CMake Tools可选便于 CMake 工程管理4.2 VSCode 工作区配置在项目根目录下创建.vscode目录包含以下配置文件1.tasks.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 root192.168.1.100:/usr/bin/,dependsOn:CMake Build (Cross Compile),problemMatcher:[]}]}2.launch.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 调试操作流程步骤 1PC 端交叉编译带调试符号# 确保 CMakeLists.txt 中构建类型为 Debug-g -O0cdbuild cmake-DCMAKE_TOOLCHAIN_FILE../toolchain-aarch64.cmake-DCMAKE_BUILD_TYPEDebug..make-j$(nproc)或在 VSCode 中执行任务CMake Build (Cross Compile)。步骤 2部署到板端# 通过 SCP 传输scpbuild/media_terminal root192.168.1.100:/usr/bin/# 或使用 NFS 共享板端直接访问 /mnt/nfs/media_terminal或在 VSCode 中执行任务Deploy to Board (SCP)。步骤 3板端启动 gdbserver# SSH 登录板端sshroot192.168.1.100# 启动 gdbserver监听 1234 端口并加载待调试程序gdbserver :1234 /usr/bin/media_terminal# 输出示例# Process /usr/bin/media_terminal created; pid 1234# Listening on port 1234若需附加到已运行的进程gdbserver :1234--attachPID步骤 4PC 端 VSCode 启动调试在源代码中设置断点点击行号左侧按F5启动调试配置Remote Debug (RV1126B)VSCode 自动通过gdb-multiarch连接到板端192.168.1.100:1234调试器停在程序入口或断点处步骤 5调试操作操作快捷键说明继续F5运行至下一断点单步跳过F10不进入函数内部单步进入F11进入函数内部单步跳出ShiftF11跳出当前函数重启CtrlShiftF5重新启动调试停止ShiftF5停止调试调试过程中可使用以下功能变量查看左侧变量面板查看局部变量监视添加表达式实时监视调用堆栈查看函数调用链断点管理条件断点、日志断点等4.4 调试结束与板端清理# 板端 gdbserver 会在调试结束后自动退出# 若需手动终止killallgdbserver# 确保端口释放netstat-tlnp|grep1234五、完整工作流总结┌─────────────────────────────────────────────────────────────┐ │ Ubuntu PC宿主机 │ │ │ │ 1. 编写源代码 (C17) │ │ ↓ │ │ 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 版本。解决# 检查程序依赖的动态库aarch64-linux-gnu-readelf-dmedia_terminal|grepNEEDED# 板端检查 glibc 版本ldd--version# 使用 SDK 自带工具链重新编译或静态链接7.2 gdbserver 连接失败排查步骤# 板端检查 gdbserver 是否运行ps|grepgdbserver# 板端检查端口是否监听netstat-tlnp|grep1234# PC 端检查网络连通性ping192.168.1.100# PC 端检查端口是否可达telnet192.168.1.1001234# 检查防火墙是否拦截sudoufw status7.3 调试时无法查看源代码原因PC 端可执行文件路径与launch.json中program字段不匹配。解决确保launch.json中program指向 PC 端带调试符号的可执行文件路径非板端路径。7.4 断点不生效原因编译优化导致代码行与机器指令不对应。解决# 确保使用 Debug 构建类型 set(CMAKE_BUILD_TYPE Debug) set(CMAKE_CXX_FLAGS_DEBUG -g -O0)7.5 NFS 挂载失败# PC 端检查 NFS 服务状态sudosystemctl status nfs-kernel-server# 检查导出列表exportfs-v# 板端检查挂载错误mount-tnfs-onolock192.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板端RV1126BIP 地址192.168.1.10192.168.1.100子网掩码255.255.255.0255.255.255.0调试端口-1234gdbserverSSH 端口2222NFS 共享路径/home/user/nfs_share/mnt/nfs挂载点