Linux 命令速查
开发工具 man addr2line

addr2line

把程序地址转换为源码文件名与行号

返回

补充说明

addr2line 属于 GNU binutils,读取 ELF 文件中的调试信息(需编译时加 -g),把运行时地址或崩溃栈里的返回地址映射回“源文件:行号”和函数名。分析 core dump、内核 oops、sanitizer 报告时非常有用。

使用时必须提供与崩溃程序完全一致的二进制(同一次编译产物),否则地址偏移对不上。对于 PIE 可执行文件和共享库,需要先用 /proc/<pid>/maps 或 core 文件计算加载基址,把运行时地址减去基址得到文件内地址。

语法

addr2line [选项] [地址...]

选项

  • -e FILE:指定要解析的 ELF 文件
  • -f:同时输出函数名
  • -C:还原 C++ 符号名(demangle)
  • -i:展开内联函数调用链
  • -p:每个结果单行显示,便于阅读
  • -s:只输出文件名,不含路径
  • -a:在结果前显示地址

实例

# 最简单的用法:地址 0x4005a6 对应哪个源文件哪一行
addr2line -e ./server 0x4005a6

# 同时显示函数名并还原 C++ 符号
addr2line -e ./server -f -C 0x4005a6

# 从 core dump 的栈中批量解析地址
addr2line -e ./server -f -C -p 0x4011a0 0x4011d3 0x40120a

# 配合 gdb 获取崩溃地址后解析
gdb -batch -ex 'bt' ./server core | grep '0x'

编译时务必保留 -g(可同时使用 -O2),发布版可用 -g 生成独立调试文件后 strip 主程序。

参考链接