如何获取Bazel构建程序崩溃时对应的代码行号
Bazel 程序崩溃代码行号获取方案
Bazel 完全支持获取程序崩溃时的代码行号,你用-c dbg编译后堆栈没行号,一般是默认调试配置没开全量调试信息、栈帧优化导致回溯断裂,或是运行时堆栈解析规则不匹配导致的。
具体解决方式
编译阶段强制生成全量调试信息
默认-c dbg在部分工具链下仅生成基础调试信息,可在编译命令追加以下参数:bazel build -c dbg --copt=-g3 --copt=-fno-omit-frame-pointer --linkopt=-rdynamic //...参数说明:
-g3生成最高等级调试信息,关联代码行号、宏定义等完整调试数据-fno-omit-frame-pointer禁止帧指针优化,保证栈帧完整可回溯,避免堆栈断裂-rdynamic导出全量动态符号表,让运行时崩溃抓取逻辑可以解析到函数、行号映射
手动解析现有堆栈地址
针对你已经拿到的崩溃堆栈中的内存地址,可直接用addr2line工具手动转成代码行号:# 替换为你编译输出的可执行文件路径,以及堆栈中的目标地址 addr2line -e bazel-out/k8-dbg/bin/你的可执行文件路径 -f -C 0x55d0e0d6e6b2执行后会直接输出对应函数名和代码所在文件、行号,不需要依赖程序本身的堆栈输出逻辑。
修正运行时堆栈抓取配置
你贴出的堆栈是典型的Abseil自带崩溃捕获逻辑输出,可在运行程序时追加环境变量或启动参数开启行号解析:ABSL_STACKTRACE_TO_STDERR=1 ./你的可执行文件 [原有启动参数]若程序依赖拆分存储的调试符号,需保证运行时可定位到对应
.debug符号文件。固定配置优化
不想每次编译都手动追加参数的话,可在项目根目录的.bazelrc文件中追加以下配置,后续使用-c dbg编译会自动生效:build:dbg --copt=-g3 build:dbg --copt=-fno-omit-frame-pointer build:dbg --linkopt=-rdynamic
常见踩坑点
- 确认
-c dbg配置未被自定义参数覆盖为--strip=always,该参数会剥离所有调试符号,导致无法关联行号 - 部分第三方依赖的编译参数未对齐时,可针对对应依赖单独追加
copts参数生成调试信息,避免第三方库部分堆栈无法解析
内容的提问来源于stack exchange,提问作者Berkay Berabi
相关产品推荐
相关产品推荐

