如何在Bazel中使用--fission生成分离的调试信息
Bazel + GCC 下--fission不生成分离调试符号的解决办法
问题根源
Bazel默认的GCC工具链没自动配置fission所需的编译/链接参数,光加--fission=yes命令行选项没用,得手动补上编译器层面的参数。
修复步骤
1. 修改BUILD文件,添加编译链接参数
给你的cc_binary目标加上copts和linkopts,指定GCC生成分离调试符号的参数:
cc_binary( name = "hello-world", srcs = ["hello-world.cc"], copts = ["-g", "-gsplit-dwarf"], # 生成.dwo分离调试文件 linkopts = ["-g", "-Wl,--gdb-index"], # 生成gdb索引,优化调试体验 )
2. 正确执行构建命令
用调试模式构建,加上--fission=yes和--output_groups=+dwo确保输出分离的调试文件:
bazel build -c dbg --fission=yes --output_groups=+dwo //main:hello-world
--output_groups=+dwo是关键,不然Bazel默认不会把.dwo文件复制到bazel-bin目录里。
3. 验证结果
去bazel-bin/main目录下检查:
- 运行
file hello-world,会显示二进制包含调试信息但符号已分离 - 能找到对应的
hello-world.dwo文件,这就是分离出来的调试符号
4. 全局配置(可选)
如果所有目标都要开fission,可以写个自定义工具链配置文件(比如toolchain.bzl),把-gsplit-dwarf这类参数全局加上,不用每个BUILD文件重复配置。
补充说明
- Bazel的
--fission选项只是开关后端逻辑,真正生成分离符号还是靠GCC的-gsplit-dwarf参数 - 旧issue里的workaround是针对老版本Bazel的,7.2.1得结合显式编译参数才能生效
内容的提问来源于stack exchange,提问作者PgN
相关产品推荐
相关产品推荐

