经过一周的反复折腾,终于能顺利 debug envoy 源码,中途踩了无数坑,在此记录一下。
尝试了以下各种手段,包括
最终,只有最后一个方法成功,其余方式均失败。
最开始用 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,参考, 效果也不如意
编译没问题,但是 **打的断点无效,无法进入断点**
# 安装依赖的工具
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/buildifie
go get -u github.com/bazelbuild/buildtools/buildoze
# 开始编译,编译超级慢,耐心等待(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
将本地代码挂载到一个安装了调试envoy必备工具的容器中,启动容器,并通过vscode可以进入容器内部,实现调试
调整 docker 资源占用大小!!!否则编译步骤会因为资源不足报错
# 编译
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 插件可以实现跨操作系统的调试,不再需要安装一堆依赖包,所有的环境都打包到容器中了,功能确实很强大!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。