📜  Linux 中的 addr2line 命令和示例

📅  最后修改于: 2022-05-13 01:57:28.697000             🧑  作者: Mango

Linux 中的 addr2line 命令和示例

Linux 中的addr2line命令用于将地址转换为文件名和行号。当可执行文件/目标文件使用objdump命令运行时,文件被反汇编并显示机器代码。这些可执行文件的机器指令与其内存位置(地址)一起显示。使用 addr2line 命令,可以将机器指令的地址映射到它源自的文件行。

句法:

addr2line [options] [addr addr ...]

笔记:

  • 对于示例,我们将使用使用 gcc 编译以下C程序后获得的a.out文件。

  • 我们还将使用a.out可执行文件的反汇编代码。以下命令用于获取反汇编代码的主要部分。
    objdump -D a.out | grep -A20 main.:
    

选项:

  • -e :应指定地址应转换的可执行文件的名称。该文件中的地址将被转换为它们的文件名和行。 (要退出 addr2line 命令,请按ctrl+c
    addr2line -e a.out [addr1] [addr2]...



    由此,我们可以推断出以下几点:

    • 只有使用调试信息生成的代码段才能成功生成正确的输出。
    • 并非程序的所有偏移都能成功提供正确的文件名和行号。在这里,即使 651 是主函数存在的偏移量,它的行和文件名也无法追溯到。
  • -f :如果指定了 -f 选项,则还会打印行地址/行所属的函数的名称。
    addr2line -e a.out -f [addr1] [addr2] ....
    

    示例 1:

    由此,我们可以推断出以下几点:

    • 如果可以映射文件名和行,则将其与函数名一起打印。这里,地址 64a 可以映射到函数和文件名 + 行。
    • 即使无法映射文件名+行,仍会打印地址所属的函数名称。在这里,即使地址不能映射到文件名和行,函数名仍然被打印出来。

    示例 2:使用的C 文件:

    注意: obj 命令与grep -A20 yolo一起使用显示 yolo函数的未组装部分及其后的部分。

  • -a、--addresses:该选项用于显示函数名前的地址、文件和行号信息。
  • -s, –basenames:此选项用于仅显示每个文件名的基数。
  • -j, –section:此选项将读取相对于指定部分的偏移量而不是绝对地址。
  • -p, –pretty-print:此选项用于使输出更加人性化。