前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >envoy vscode调试环境搭建

envoy vscode调试环境搭建

原创
作者头像
kinnylee
修改2021-12-06 21:17:37
2.5K0
修改2021-12-06 21:17:37
举报
文章被收录于专栏:kinnylee钻研技术kinnylee钻研技术

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 本机调试

编译没问题,但是 **打的断点无效,无法进入断点**

代码语言: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

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"
代码语言:txt
复制
# 编译

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
image.png

lanch.json 文件

image.png
image.png

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

image.png
image.png

总结

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

参考

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • envoy vscode调试环境搭建
  • clion 调试
  • vscode Mac 本机调试
  • remote-container 远程调试
    • 原理
      • 前置步骤
        • 步骤如下:
        • 总结
        • 参考
        相关产品与服务
        容器服务
        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档