envoy vscode调试环境搭建

51,771 阅读3分钟

envoy vscode调试环境搭建

经过一周的反复折腾,终于能顺利 debug envoy 源码,中途踩了无数坑,在此记录一下。

尝试了以下各种手段,包括

  1. Jetbrains clion 调试
  2. vscode Mac 本机 gdb(lldb) 调试
  3. 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文件 image.png

lanch.json 文件 image.png

以上步骤完成,F5 调试,终于发现进断点了,大功告成!!!

image.png

总结

容器的出现,解决了应用发布问题。devcontainer 插件可以实现跨操作系统的调试,不再需要安装一堆依赖包,所有的环境都打包到容器中了,功能确实很强大!

参考