You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AddressSanitizer分离调试信息后报告无对应源码行号如何解决?

问题原因

  1. RPM打包默认会执行strip操作,将二进制文件中的调试信息拆分到独立的debuginfo包中,而你使用的libasan3属于gcc6配套的旧版本AddressSanitizer,默认不会主动读取分离的debuginfo文件,只能读取嵌入在主二进制中的调试符号。
  2. 未为AddressSanitizer指定符号化工具:asan本身不负责解析调试信息,需要依赖llvm-symbolizer或addr2line这类外部工具完成地址到源码行的转换。
  3. 若debuginfo包安装路径不符合默认搜索规则,即使安装了debuginfo包,asan也无法找到对应的调试信息文件。

可行解决方案

方案1:保留调试符号到主二进制(最适合测试场景)

修改rpm构建的spec文件,添加以下配置,关闭调试信息拆分和strip操作:

# 禁用生成独立debuginfo包
%define debug_package %{nil}
# 禁用strip操作,保留所有调试符号到主二进制
%define __strip /bin/true

重新构建rpm包后安装,主程序会直接携带-g参数生成的所有调试信息,asan可以直接读取并输出源码行号。

方案2:配合debuginfo包使用符号化工具

如果必须使用分离的debuginfo包,按以下步骤操作:

  1. 安装符号化工具:yum install llvm(提供llvm-symbolizer)或确认系统已有addr2line(属于binutils包,默认已安装)
  2. 运行程序前设置环境变量,指定asan使用的符号化工具:
export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer
# 如果你使用addr2line,路径为/usr/bin/addr2line
  1. 确认debuginfo包正确安装,可通过以下命令验证调试文件存在:
# 查看二进制的build id
eu-readelf -n /usr/local/bin/main | grep 'Build ID'
# 确认对应调试文件存在,替换<build-id前两位>和<剩余build-id>
ls /usr/lib/debug/.build-id/<build-id前两位>/<剩余build-id>.debug

完成配置后再运行程序,asan就可以从debuginfo文件中读取调试信息输出源码行号。

方案3:手动符号化报错地址

如果不需要实时输出源码行号,可在拿到asan报错后手动解析:

addr2line -e /usr/local/bin/main <报错中的偏移地址>
# 示例:addr2line -e /usr/local/bin/main 0x400ee2

执行命令后会直接输出对应的源码文件路径和行号。

注意事项

请确保rpm构建过程中编译参数的-g没有被覆盖,部分rpm默认配置会自动移除调试参数,可在spec的编译阶段打印CFLAGS/CXXFLAGS确认参数生效。

内容的提问来源于stack exchange,提问作者Matt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 14:09:02