Linux下addr2line命令用法

Linux下addr2line命令用法Linux 下 addr2line 命令用于将程序指令地址转换为所对应的函数名 以及函数所在的源文件名和行号 当含有调试信息 g 的执行程序出现 crash 时 coredumped 可使用 addr2line 命令快速定位出错的位置 如果无法确定文件名或函数名 addr2line 将在它们的位置打印两个问号 如果无法确定行号 addr2line 将打印 0 或一个问号 参数说明 1 a 在函数名 文件名和行号信息之前 以十六进制形式显示地址

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

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

      参数说明:

      (1).-a:在函数名、文件名和行号信息之前,以十六进制形式显示地址。

      (2).-b:指定目标文件的格式为bfdname。

      (3).-C:将低级别的符号名解码为用户级别的名字。

      (4).-e:指定需要转换地址的可执行文件名,默认文件是a.out。

      (5).-f:在显示文件名、行号信息的同时显示函数名。

      (6).-s:仅显示每个文件名(the base of each file name)去除目录名。

      (7).-i:如果需要转换的地址是一个内联函数,则还将打印返回第一个非内联函数的信息。

      (8).-j:读取指定section的偏移而不是绝对地址。

      (9).-p:使打印更加人性化:每个地址(location)的信息都打印在一行上。

      (10).-r:启用或禁用递归量限制。

      (11).–help:打印帮助信息。

      (12).–version:打印版本号。

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

      测试代码main.cpp如下:

#include 
  
    int divide(int a, int b) { return a/b; } int main() { fprintf(stdout, "input value\n"); int a = 3, b = 0; int div = divide(a, b); fprintf(stdout, "div value: %d\n", div); return 0; } 
  

      在终端输入以下命令:注意不要忘记-g,否则在使用addr2line命令时无法显示文件名和行号

g++ -g main.cpp -o main

      执行main,输出结果如下:

Linux下addr2line命令用法

      通过dmesg命令查看系统日志的错误信息,结果如下:其中ip字段后面的数字4005c4就是main程序出错时所执行的位置

Linux下addr2line命令用法

       通过addr2line命令将地址4005c4转换定位到代码中出错的位置,命令及执行结果如下:可见crash的地方在main.cpp文件的第5行,在divide函数中

Linux下addr2line命令用法

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/201248.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午9:45
下一篇 2026年3月20日 上午9:45


相关推荐

  • VMware许可证过期_windows许可证过期什么原因

    VMware许可证过期_windows许可证过期什么原因激活密钥VMware2017v14.x永久许可证激活密钥FF31K-AHZD1-H8ETZ-8WWEZ-WUUVACV7T2-6WY5Q-48EWP-ZXY7X-QGUWD这表文章解决了大部分的常见问题,大家可以去看看http://www.zdfans.com/5928.html

    2025年11月17日
    9
  • JMM详解_jmm是啥

    JMM详解_jmm是啥如果大家对java架构相关感兴趣,可以关注下面公众号,会持续更新java基础面试题,netty,springboot,springcloud等系列文章,一系列干货随时送达,超神之路从此展开,BTAJ不再是梦想!概念​ Java内存模型(JavaMemoryModel,JMM)JMM主要是为了规定了线程和内存之间的一些关系。根据JMM的设计,系统存在一个主内存(MainMemory),Java中所有变量都储存在主存中,对于所有线程都是共享的。每条线程都有自己的工作内存(Worki

    2025年9月12日
    7
  • 智谱 GLM-4.5 也支持了Claude Code

    智谱 GLM-4.5 也支持了Claude Code

    2026年3月12日
    2
  • pycharm需要安装哪些包_用于引入包的关键字

    pycharm需要安装哪些包_用于引入包的关键字在学习python的时候,被推荐了使用PyCharm这款IDE,但是在import包的时候却发生了问题–无法引入,但是明明通过了pip进行模块的加载,百度之后,了解到,在这款IDE中,要导入包,需要手动进行引入。如下图所示首先在file中找到settings顺带一下,如果有的同学是第一次接触这款IDE,可能对与皮肤颜色不太了解,其实也是在settings中进行设置的,而且该公司旗下的其他产品如…

    2022年8月28日
    4
  • c语言null和nullptr,nullptr和NULL

    c语言null和nullptr,nullptr和NULLnullptr 是 c 11 中的关键字 表示空指针要区分 nullptr 和 NULL 首先要明白 NULL 的含义 NULL 是一个宏定义 在 c 和 c 中的定义不同 c 中 NULL 为 void 0 而 c 中 NULL 为整数 0 C 语言中 NULL 定义 defineNULL void 0 c 语言中 NULL 为 void 类型的指针 但允许将 NULL 定义为 0 c 中 NULL 的定

    2026年3月17日
    2
  • netbeans11安装教程_Netbeans使用教程

    netbeans11安装教程_Netbeans使用教程小订阅先声明 这个教程是个 习惯了 myeclipse 的人用的 NetBeans 是由 Sun 建立的开放源码的软件开发工具 是一个开放框架 可扩展的开发平台 可以用于 Java C C 等的开发 本身是一个开发平台 可以通过扩展插件来扩展功能 它是一个全功能的开放源码 JavaIDE 可以帮助开发人员编写 编译 调试和部署 Java 应用 并将版本控制和 XML 编辑融入其众多功能之中 NetBean

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号