gdb envoy找不到源代码的原因

现象

正常bazel编译之后gdb找不到源码

 

原因

原因是因为envoy默认编译的时候启用了fission选项,在配置文件.bazel里

 

fission选项的意思是:从.o文件中分离debuginfo到.dwo文件中从而减少link时候内存消耗,加快link的速度。

https://gcc.gnu.org/wiki/DebugFission

启用了这个bazel选项之后,gcc会追加编译选项-gsplit-dwarf 

 要加-Wl, --gdb-index

envoy已经加了,但是gdb也没有用

 

应该是gdb的问题,我的gdb14 + gcc12不行。

通过源码编译gdb,换成gdb16+gcc12还是不行。不过报错不一样了,至少能找到dwo了,只能说,还是软件问题,或者兼容性问题。

但envoy官方说,gcc>=9是好使的。

 

 

fission原理

1. 核心作用​​

​​(1) 调试信息分离​​

  • ​​传统模式​​:调试信息(如变量名、符号表)嵌入对象文件(.o)中,导致文件臃肿,链接时内存占用高。
  • ​​Fission 模式​​:将调试信息独立存储到 .dwo 文件(DWARF Object)中,对象文件仅保留必要元数据。
     
     
    main.o # 精简后的对象文件
    main.dwo # 独立的调试信息文件
     

​​(2) 性能优化​​

  • ​​减少内存占用​​:链接器处理轻量级对象文件,降低内存压力(尤其对大型项目)。
  • ​​加速增量构建​​:仅重新编译变更模块的 .dwo 文件,减少重复工作。

 

解决办法

如果用gcc,还想debug,就禁用fission选项。

如果用clang,请使用llvm工具链:clang+lld+lldb,另外clang+lld+gdb12也是好使的

 

-----------------------------------------------------------

查看二进制信息

readelf -wi /root/caotong1/envoy

image

 

posted on 2025-05-12 20:37  toong  阅读(7)  评论(0)    收藏  举报