补充说明
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 主程序。