Linux addr2line 命令

一、介绍

描述

Linux下addr2line命令用于将程序指令地址转换为所对应的函数名、以及函数所在的源文件名和行号。当含有调试信息(-g)的执行程序出现crash时(core dumped),可使用addr2line命令快速定位出错的位置。

如果无法确定文件名或函数名,addr2line将在它们的位置打印两个问号;如果无法确定行号,addr2line将打印0或一个问号。

查看使用和帮助手册

man addr2line
addr2line -h

参数说明

-a --addresses:在函数名、文件和行号信息之前,显示地址,以十六进制形式。
-b --target=<bfdname>:指定目标文件的格式为bfdname。
-e --exe=<executable>:指定需要转换地址的可执行文件名。
-i --inlines : 如果需要转换的地址是一个内联函数,则输出的信息包括其最近范围内的一个非内联函数的信息。
-j --section=<name>:给出的地址代表指定section的偏移,而非绝对地址。
-p --pretty-print:使得该函数的输出信息更加人性化:每一个地址的信息占一行。
-s --basenames:仅仅显示每个文件名的基址(即不显示文件的具体路径,只显示文件名)。
-f --functions:在显示文件名、行号输出信息的同时显示函数名信息。
-C --demangle[=style]:将低级别的符号名解码为用户级别的名字。
-h --help:输出帮助信息。
-v --version:输出版本号。

注意:使用时一般需通过 -e 指定可执行程序名称,若不指定则默认a.out

dmesg命令:全称为display message,用来显示Linux内核环形缓冲区信息。

二、使用示例

有如下test.cpp文件:

#include<stdio.h>
int divide(int x, int y)
{
    return x/y;
}

int main()
{
    printf("hello world\n");
    int x = 3;
    int y = 0;
    int div = divide(x, y); 
    printf("%d / %d = %d\n", x, y, div);
    return 0;
}

编译:g++ -Wl,-Map=test.map -g test.cpp -o test

注意:-Wl,-Map=test.map 这里Wl后面的东西是作为参数传递给链接器ld,这里的含义是生成名叫test.map的.map文件。

.map文件:map 文件对应的中文名应该是映射文件,用来展示(映射)项目构建的链接阶段的细节。

从map文件我们可以了解到:

  • 程序各区段的寻址是否正确
  • 程序各区段的size,即目前存储器的使用量
  • 程序中各个symbol的地址
  • 各个symbol在存储器中的顺序关系(这在调试时很有用)
  • 各个程序文件的存储用量

查找divide函数的地址

grep divide test.map

在这里插入图片描述

使用addr2line定位

#显示文件和行数
addr2line -e test 0x0000000000001169	

#显示文件、行数和内容
addr2line -e test 0x0000000000001169 -f -C

在这里插入图片描述

三、参考资料

其他参考

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: addr2line是一个Linux下的常见工具,用来将程序的地址转换为文件名和行号等位置信息。这个工具通常用在程序崩溃时进行调试,以便追踪问题出现的位置,帮助程序猿进行修复。 如果想使用addr2line,首先需要下载与安装。通常这个工具会随着编译器一起安装,所以在一般的Linux系统中这个工具是默认安装的。如果想自己手动安装,可以使用Linux系统自带的包管理器进行下载和安装,具体安装方法如下: 1. 打开终端,使用管理员权限登录 2. 输入命令 sudo apt-get update,进行包列表更新 3. 输入命令 sudo apt-get install binutils,进行addr2line安装(如果系统已经安装过binutils,则这个步骤可以省略不操作) 安装后即可使用addr2line进行调试,具体操作方法可以参考相关手册或在线教程。需要注意的是,使用addr2line可能需要一定的Linux系统及程序调试方面的知识储备,建议有一定经验的程序员进行操作。 ### 回答2: addr2line是一个用于将程序计数器地址(PC)转换为源文件和行号的GNU工具。它通常用于调试和跟踪代码中错误时查找源代码和行号。它可以通过GNU binutils包来安装和使用。在大多数Linux发行版中,binutils都已经安装,因此addr2line可以直接使用。 要下载addr2line,可以通过访问GNU binutils网站来获得它的源代码并手动构建和安装。对于大多数用户来说,最简单的方法是使用操作系统的包管理器来安装binutils。例如,在Ubuntu上可以使用apt-get命令,CentOS和Fedora上可以使用yum命令。 安装完成后,可以使用以下命令来调用addr2lineaddr2line -e <binaryfile> <address> 其中,binaryfile是要分析的二进制文件的路径,address是程序计数器地址。addr2line将打印出与给定地址相关联的源文件和行号。 总的来说,addr2line是一个非常实用的工具,可以帮助开发人员在调试代码时更轻松地定位和修复问题。因此,学会下载和使用addr2line对开发人员来说至关重要。 ### 回答3: addr2line是用于将地址转换为行号和文件名的命令行工具。它通常与gdb一起使用,以便在调试过程中确定源代码行号。 要下载addr2line,首先需要安装GNU binutils。地址取决于你的操作系统。在Ubuntu上,可以使用以下命令安装: sudo apt-get install binutils 安装完成后,可以使用以下命令检查addr2line是否可用: addr2line --help 如果命令返回帮助文档,则addr2line已经成功安装。 如果你想在自己的代码中使用addr2line,则需要使用编译器生成调试信息。在GCC编译器中,可以通过以下命令生成调试信息: gcc -g -o myprogram myprogram.c 在将程序编译为可执行文件后,可以使用以下命令将地址转换为文件名和行号: addr2line -e myprogram 0x4005a5 此命令将返回myprogram中地址0x4005a5所在的文件名和行号。 总之,addr2line是一个非常实用的工具,可以帮助开发人员快速解决代码中的问题。安装过程简单,只需确保已安装GNU binutils即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值