envoy vscode调试环境搭建
经过一周的反复折腾,终于能顺利 debug envoy 源码,中途踩了无数坑,在此记录一下。
尝试了以下各种手段,包括
- Jetbrains clion 调试
- vscode Mac 本机 gdb(lldb) 调试
- vscode docker container 容器调试
最终,只有最后一个方法成功,其余方式均失败。
clion 调试
最开始用 vscode 配合微软的 C/C++ 插件查看 envoy 源码,但是跳转代码的准确度不高,有些很明确的函数跳转也会让从一堆重名函数中选择。之前在使用 jetbrain 全家桶体验都不错,包括 java的 idea,go的goland,python的pycharm,因此搜了一下 c++ 有对应的 clion 这个 ide。
使用 Clion 查看源码,但是 Clion 只能识别 CMakeLists 文件,需要安装 bazel 插件,
通过 bazel-cmakelists 工具 将 envoy 的 bazel 转为 cmake
但是转换一直报错,转换对象过大,java oom了, 尝试了各种参数均无效,转换工具也好几年没有更新。
网上有网友生成的 cmake 工程文件 CMakeLists.txt,参考, 效果也不如意
vscode Mac 本机调试
编译没问题,但是 打的断点无效,无法进入断点
# 安装依赖的工具
brew install coreutils wget cmake libtool go bazel automake ninja clang-format autoconf aspell
# 安装 bazelisk(macos 推荐bazelisk)
# 由于 bazel 版本很多,不同 istio-proxy(envoy) 版本依赖的 bazel 版本也不一样,我们可以直接安装 bazelisk ,一个用于 bazel 多版本管理的工具,它可以自动识别项目中 .bazelversion 文件,选取指定版本的 bazel 来进行构建(可以自动下载对应版本的 bazel 二进制)
brew install bazel bazelisk
go get -u github.com/bazelbuild/buildtools/buildifier
go get -u github.com/bazelbuild/buildtools/buildozer
# 开始编译,编译超级慢,耐心等待(3h)
# [ 8063 个项目]
# 必须要设置--spawn_strategy=local,禁用sandbox,否则lldb找不到符号表,显示的是汇编指令而不是代码
# 实际上添加了这个参数也没用
bazel build -c dbg --spawn_strategy=local //source/exe:envoy-static
# 编译完成
# INFO: Elapsed time: 8825.094s, Critical Path: 6888.96s
# INFO: 5724 processes: 3 internal, 5721 darwin-sandbox.
# INFO: Build completed successfully, 5724 total actions
# 生成 vscode 环境下的调试文件
tools/vscode/generate_debug_config.py //source/exe:envoy-static --args "-c envoy-config.json" --debugger lldb
# 生成 clangd 配置文件
tools/vscode/refresh_compdb.sh
remote-container 远程调试
原理
将本地代码挂载到一个安装了调试envoy必备工具的容器中,启动容器,并通过vscode可以进入容器内部,实现调试
前置步骤
调整 docker 资源占用大小!!!否则编译步骤会因为资源不足报错
步骤如下:
-
打开 envoy/.devcontainer/devcontainer.json
-
Vscde 右下角会提示以 devcontainer 方式打开。如果没有提示,按下 F1,搜索 remote container: reopen ...
-
这时候会开始将dockerfile打包成镜像,需要一定时间,请耐心等待。镜像打包成功会启动容器,并通过vscode进入容器内部
- 注意:需要把docker占用虚拟机的资源调大,否则编译资源不足会报错
-
在vscode 打开命令行执行以下命令(这时是在容器内部)
- 生成配置文件:tools/vscode/refresh_compdb.sh,这一步会生成各种 complie_commands.json文件
- 生成 vscode 调试文件:tools/vscode/generate_debug_config.py //source/exe:envoy-static --args "-c envoy-config.json"
# 编译
tools/vscode/generate_debug_config.py //source/exe:envoy-static --args "-c envoy-config.json" --debugger lldb
# 生成 clangd 配置文件
tools/vscode/refresh_compdb.sh
生成的 complie_commands.json文件
lanch.json 文件
以上步骤完成,F5 调试,终于发现进断点了,大功告成!!!
总结
容器的出现,解决了应用发布问题。devcontainer 插件可以实现跨操作系统的调试,不再需要安装一堆依赖包,所有的环境都打包到容器中了,功能确实很强大!