如何用VSCode调试Apollo园区版:从零开始完整指南
一、背景知识
本文将详细演示如何用VSCode调试Apollo 9.0园区版的camera_detection_bev
模块(鸟瞰图摄像头检测模块)。在开始操作前,我们先理解几个核心概念:
- 编译数据库:记录每个源文件的编译参数(如头文件路径、宏定义等),使编辑器能准确理解代码结构
- 远程调试:在本地VSCode中调试运行在远程服务器/Docker容器中的程序
- 符号链接:创建文件"快捷方式",解决开发环境与运行环境路径不一致的问题
通过本文,你将掌握:
- 编译日志生成原理 - 如何捕获完整编译命令
- 代码智能跳转基础 - 生成
compile_commands.json
的方法 - 远程调试机制 - 配置SSH远程调试的完整流程
- 运行时环境搭建 - 调试Apollo模块的特殊配置技巧
二、操作步骤详解
1. 准备调试环境
1.1 拷贝待调试模块
# 1、进入Apollo开发容器
aem enter
# 2、创建工作目录 (避免修改原始代码)
mkdir -p modules/perception/
# 3、在宿主机上将camera_detection_bev拷贝到容器内的/apollo_workspace/modules/perception/目录下
1.2 安装VSCode v1.85版本
版本兼容性原理
Apollo 9.0的Docker镜基于Ubuntu 18.04构建:
- 新版VSCode依赖glibc 2.29+
- Ubuntu 18.04默认glibc版本为2.27
- v1.85是最后一个兼容glibc 2.27的稳定版本
若强行使用新版会导致VSCode Server安装失败:
/lib/x86_64-linux-gnu/libc.so.6: version 'GLIBC_2.28' not found
2. 生成编译数据库
2.1 捕获完整编译命令
buildtool build --dbg -p modules/perception/camera_detection_bev \
--arguments "-s --jobs=1" 2>&1 | tee build.log
参数解析
--dbg
:生成带调试符号的二进制文件 (GDB必需)-s
:显示完整编译命令 (Bazel默认隐藏)--jobs=1
:强制单线程编译 (确保日志顺序正确)2>&1 | tee build.log
:同时输出到终端和文件
关键原理
编译日志中包含真实的编译指令,这是生成compile_commands.json
的基础。
2.2 生成compile_commands.json
创建日志解析脚本:
cd /apollo_workspace/
ROOT_DIR=`find .cache/bazel -name "apollo-park-generic" | head -n 1 | sed 's#.cache/bazel/##g' | awk -F/ '{print "/apollo_workspace/.cache/bazel/"$1"/execroot/apollo-park-generic"}'`
cat > parser.py <<-EOF
import re
import sys
import json
def extract_strings(text):
# 正则表达式匹配模式:非贪婪模式匹配最近的一个右括号
pattern = r'crosstool_wrapper_driver_is_not_gcc.*?\)'
# 使用re.DOTALL确保"."匹配换行符
matches = re.findall(pattern, text, re.DOTALL)
return matches
def main():
# 从文件或标准输入读取内容
if len(sys.argv) > 1:
with open(sys.argv[1], 'r') as file:
text = file.read()