1、什么是addr2line
addr2line
是 GNU Binutils 工具集中的一个命令行工具,用于将程序中的地址转换为源代码中的文件名和行号。它在调试和问题定位中非常有用,尤其是在处理崩溃或 core dump 时。
2、常用选项
选项 | 功能 |
---|---|
-e <file> |
指定目标文件(可执行文件或库)。 |
-f |
显示函数名。 |
-C |
解码 C++ 函数名(即去除名称修饰)。 |
-s |
静默模式(仅显示文件名和行号)。 |
-p |
输出文件名和行号时包含完整路径(方便定位)。 |
3、 常用的功能
3.1 定位单个地址
假设有一个 C 程序:
#include <stdio.h>
void my_function() {
printf("Hello, addr2line!\n");
}
int main() {
my_function();
return 0;
}
编译时加入调试信息:
gcc -g -o demo demo.c
然后使用 objdump
获取函数地址:
objdump -t demo | grep my_function
0000000000401136 g F .text 0000000000000016 my_function
使用 addr2line
将地址转换为文件名和行号:
addr2line -e demo 0x401136
/path/to/demo.c:3
3.2 函数调用栈地址解析
假设有一个崩溃堆栈,如下所示:
Segmentation fault at address 0x401136
可以使用 addr2line
定位问题:
addr2line -e demo -f -C 0x401136
my_function
/path/to/demo.c:3
3.3 批量解析多个地址
如果有多个地址可以一起解析:
addr2line -e demo 0x401136 0x40115f