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)中,对象文件仅保留必要元数据。
(2) 性能优化
- 减少内存占用:链接器处理轻量级对象文件,降低内存压力(尤其对大型项目)。
- 加速增量构建:仅重新编译变更模块的
.dwo文件,减少重复工作。
解决办法
如果用gcc,还想debug,就禁用fission选项。
如果用clang,请使用llvm工具链:clang+lld+lldb,另外clang+lld+gdb12也是好使的

-----------------------------------------------------------
查看二进制信息
readelf -wi /root/caotong1/envoy

浙公网安备 33010602011771号