📅  最后修改于: 2023-12-03 15:02:43.074000             🧑  作者: Mango
在 Linux 中,addr2line
是一个十分实用的命令行工具,用于将程序中的地址解析为文件名和行号。这个命令通常用于调试程序时查找出错的代码位置。
addr2line
的命令格式如下:
addr2line [选项]... [地址]...
选项包括:
-a
,--addresses
:输入地址是十六进制的;-b
,--basename
:只输出文件名而不是全路径;-C
,--demangle
:对 C++ 符号进行反编译(还原函数名);-e
,--exe=文件名
:指定可执行文件;-f
,--functions
:同时输出函数名。下面是一个示例,以展示 addr2line
命令的常见用法:
#include <stdio.h>
void print_backtrace() {
printf("backtrace:\n");
printf("[0x%lx]: line %d in %s()\n", (long unsigned int)&&L1, __LINE__, __func__);
L1:
printf("[0x%lx]: line %d in %s()\n", (long unsigned int)&&L2, __LINE__, __func__);
L2:
printf("[0x%lx]: line %d in %s()\n", (long unsigned int)&&L3, __LINE__, __func__);
L3:
printf("[0x%lx]: line %d in %s()\n", (long unsigned int)&&L4, __LINE__, __func__);
L4:
printf("[0x%lx]: line %d in %s()\n", (long unsigned int)&&L5, __LINE__, __func__);
L5:
return;
}
int main() {
print_backtrace();
return 0;
}
gcc -g -o backtrace backtrace.c
其中,-g
参数用于生成调试信息。
./backtrace
输出如下:
backtrace:
[0x55f81cf6e149]: line 6 in print_backtrace()
[0x55f81cf6e14d]: line 8 in print_backtrace()
[0x55f81cf6e151]: line 10 in print_backtrace()
[0x55f81cf6e155]: line 12 in print_backtrace()
[0x55f81cf6e159]: line 14 in print_backtrace()
这个程序用 print_backtrace()
函数打印了函数调用的栈信息。
addr2line
命令解析地址:addr2line -e backtrace 0x55f81cf6e149 0x55f81cf6e14d 0x55f81cf6e151 0x55f81cf6e155 0x55f81cf6e159
输出如下:
print_backtrace
backtrace.c:6
print_backtrace+0x6
backtrace.c:8
print_backtrace+0xe
backtrace.c:10
print_backtrace+0x16
backtrace.c:12
print_backtrace+0x1e
backtrace.c:14
这个示例展示了如何使用 addr2line
命令查找地址对应的源代码位置,从而快速定位错误的代码位置。
addr2line
在程序调试时是十分实用的命令行工具,它可以将程序中的地址解析为文件名和行号,方便开发者快速定位代码位置,对程序的调试与优化都有很大的帮助。