📜  Linux 中的 addr2line 命令和示例(1)

📅  最后修改于: 2023-12-03 15:02:43.074000             🧑  作者: Mango

Linux 中的 addr2line 命令和示例

在 Linux 中,addr2line 是一个十分实用的命令行工具,用于将程序中的地址解析为文件名和行号。这个命令通常用于调试程序时查找出错的代码位置。

命令格式

addr2line 的命令格式如下:

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

选项包括:

  • -a--addresses:输入地址是十六进制的;
  • -b--basename:只输出文件名而不是全路径;
  • -C--demangle:对 C++ 符号进行反编译(还原函数名);
  • -e--exe=文件名:指定可执行文件;
  • -f--functions:同时输出函数名。
示例

下面是一个示例,以展示 addr2line 命令的常见用法:

  1. 先编写一个简单的 C 程序:
#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;
}
  1. 编译生成可执行文件:
gcc -g -o backtrace backtrace.c

其中,-g 参数用于生成调试信息。

  1. 运行程序:
./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() 函数打印了函数调用的栈信息。

  1. 使用 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 在程序调试时是十分实用的命令行工具,它可以将程序中的地址解析为文件名和行号,方便开发者快速定位代码位置,对程序的调试与优化都有很大的帮助。