addr2line objdump命令使用方法_objdump 查看越界-程序员宅基地

技术标签: dmesg  addr2line  

在Linux下写C/C++程序的程序员,时常与Core Dump相见。在内存越界访问,收到不能处理的信号,除零等错误出现时,我们精心或不精心写就的程序就直接一命呜呼了,Core Dump是Linux仁慈地留下的程序的尸体,帮助程序员们解决了一个又一个问题。

有时配置不给力,Linux直接毁尸灭迹,没有了Core文件;又有时,刚好磁盘空间不足,Core文件写不下了。没有Core文件的时候,如何知道程序在什么地方出错了呢?addr2line就在这时派上用场。

这是一个示例程序,func函数返回参数a除以参数b的结果。这里使用0作为除数,结果就是程序因为除以0导致错误,直接中断了。

#include <stdio.h>
int func(int a, int b)
{
  return a / b;
}
int main()
{
  int x = 10;
  int y = 0;
  printf("%d / %d = %d\n", x, y, func(x, y));
  return 0;

}

使用

$ gcc -o test1 -g test1.c

编译程序,test1.c是程序文件名。

执行程序($./test1),结果程序异常中断。

查看系统dmesg信息($dmesg | grep test1),发现系统日志的错误信息:

[981982.370476] traps: test1[27542] trap divide error ip:400534 sp:7ffedb64b690 error:0 in test1[400000+1000]

这条信息里的ip字段后面的数字就是test1程序出错时所程序执行的位置。使用addr2line就可以将400534转换成出错程序的位置:

$ addr2line -e test1 400534
/home/hanfoo/code/test/addr2line/test1.c:5

这里的test1.c:5指的就是test1.c的第5行

return a / b;  

也正是这里出现的错误。addr2line帮助我们解决了问题。

addr2line如何找到的这一行呢。在可执行程序中都包含有调试信息,其中很重要的一份数据就是程序源程序的行号和编译后的机器代码之间的对应关系Line Number Table。DWARF格式的Line  Number Table是一种高度压缩的数据,存储的是表格前后两行的差值,在解析调试信息时,需要按照规则在内存里重建Line Number  Table才能使用。

Line Number Table存储在可执行程序的.debug_line域,使用命令

$ readelf -w test1

可以输出DWARF的调试信息,其中有两行

Special opcode 146: advance Address by 10 to 0x4004fe and Line by 1 to 5  

Special opcode 160: advance Address by 11 to 0x400509 and Line by 1 to 6  

这里说明机器二进制编码的0x4004fe位置开始,对应于源码中的第5行,0x400509开始就对应与源码的第6行了,所以400506这个地址对应的是源码第5行位置。

addr2line通过分析调试信息中的Line Number Table自动就能把源码中的出错位置找出来,再也不怕Linux毁尸灭迹了。

for example:

prebuilts/tools/gcc-sdk/addr2line -e out/target/product/z4dtg/obj/EXECUTABLES/xxxxx_intermediates/LINKED/xxxxxxxx  0x00007165

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/tj_shenzhendaxue/article/details/80944172

智能推荐

matlab iir 高通滤波器的设计,基于MATLAB的IIR滤波器的设计.doc-程序员宅基地

文章浏览阅读598次。MACROBUTTON MTEditEquationSection2 SEQ MTEqn \r \h \* MERGEFORMAT SEQ MTSec \r 1 \h \* MERGEFORMAT SEQ MTChap \r 1 \h \* MERGEFORMAT 毕业设计 课程设计 毕业论文 详细资料 联系QQ号;1620812008本科毕业设计(论文)基于MATLAB的IIR滤波..._matlab设计iir滤波器为高通滤波器,截至频率为0.5π

pycharm代码上传到github_git commit为什么需要邮箱和名字、-程序员宅基地

文章浏览阅读6.5k次,点赞11次,收藏26次。一.准备工作Ⅰ.git下载和安装要连接GitHub,首先git是必不可少的,git的安装的基本使用很简单,这里并不是讲git使用的教程,所以只是提一下就略过了.Ⅱ.GitHub设置添加SSH Key这一步算是连接GitHub的最基本的一步了,git是分布式的代码管理工具,远程的代码管理是基于ssh的,所以得先配好SSH key.1.创建一个SSH Key打开终端,windows下面可能叫做git ..._git commit为什么需要邮箱和名字、

B+Tree 在线模拟_在线体验b+tree-程序员宅基地

文章浏览阅读2.4k次,点赞8次,收藏9次。链接地址:https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html数据结构可视化:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html_在线体验b+tree

缺失值的查找与替换_ggto05.net-程序员宅基地

文章浏览阅读5.6k次。X<-c(1,2,3,NA,5) y<-c(236,90,56,NA,7) z<-c(54,6558,5,21,5) x1<-data.frame(X,y,z) r<-c(NA,1,2,NA,NA)ee> ee X y z r1 1 236 54 NA2 2 90 6558 13 3 56 5 24 NA NA 21 NA5 5_ggto05.net

R判别分析_判别分析的应用案例r语言-程序员宅基地

文章浏览阅读377次。常用的判别分析方法是距离判别、贝叶斯判别和Fisher判别等。_判别分析的应用案例r语言

Maven基础(三)—— 依赖管理与生命周期_项目依赖管理生命周期-程序员宅基地

文章浏览阅读124次。1、依赖管理1、依赖配置依赖指当前项目运行所需的jar,一个项目可以设置多个依赖2、依赖传递将project03的坐标复制到project02的依赖中直接依赖:在当前项目中通过依赖配置建立的依赖关系间接依赖∶被资源的资源如果依赖其他资源,当前项目间接依赖其他资源路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的特殊优先:当同级配置了相同资源的不同_项目依赖管理生命周期

随便推点

current_thread_info在ARM32和ARM64平台的不同点解析_arm64 thread_info-程序员宅基地

文章浏览阅读2.5k次。首先对current_thread_info不熟悉的同学可以先百度一下这是个什么东西?我们这里仅仅简单的提一下,current_thread_info用于获取当前进程的信息。ARM32平台相关定义#define THREAD_SIZE_ORDER 1#define THREAD_SIZE (PAGE_SIZE &lt;&lt; THREAD_SIZE_ORDER)union thr..._arm64 thread_info

阿里P8用这份402页多线程与架构设计笔记,征服你 吊打你_阿里线程框架-程序员宅基地

文章浏览阅读121次。前言随着计算机硬件的不断发展,CPU进入多核时代,并发运算因此也上升到了并行运算的高度,作为Java程序员,如何最大化地“压榨”CPU的资源,利用CPU超高的计算速度编写高效快速运行的程序,如何解决CPU与RAM之间速度不匹配的问题呢?今天分享一份《Java高并发编程详解多线程与架构设计》就会帮你解决这些问题,本书结合作者的实践经验,不仅介绍了高速缓存Cache、Cache Line、Java内存模型,以及现代CPU基本架构等相关知识,还深入讲解了Java跨平台的高并发解决方案。本书实._阿里线程框架

宝塔php伪静态规则,使用宝塔管理nginx伪静态规则配置方法技巧-程序员宅基地

文章浏览阅读1.8k次。我们网站使用的服务器环境一般有IIS、Apache、Tomcat、Nginx 等,他们各有优劣。一般虚拟空间使用IIS 和 Apache居多,这两个的配置都比较简单,IIS一般都安装了ISAPI_Rewrite 模块,可以直接使用和Apache一样的.htaccess文件来配置,直接将.htaccess文件上传到网站根目录即可。.htaccess 文件代码RewriteEngine OnRewri..._宝塔怎么添加htaccess规则

2023 Zblog对接微信小程序源码 附教程_博客小程序源码-程序员宅基地

文章浏览阅读189次。在HbuilderX中打开前端项目,依次点击 运行 =》 运行到小程序模拟器 =》微信开发者工具。必要工具:HbuilderX,微信开发者工具。_博客小程序源码

mysql组合索引与单列索引_假设有一张名为orders的订单表-程序员宅基地

文章浏览阅读1.1k次。1、组合索引能够避免回表查询:假设有一张订单表(orders),包含order_id和product_id二个字段。一共有31条数据。符合下面语句的数据有5条。执行下面的sql语句:select product_id from orderswhere order_id in (123, 312, 223, 132, 224);这条语句要mysql去根据order_id进行搜索,然后返回_假设有一张名为orders的订单表

python+jenkins持续集成输出html测试报告_jenkins + python + publish html reports-程序员宅基地

文章浏览阅读7k次。前言在jenkins上展示html的报告,需要添加一个HTML Publisher plugin插件,把生成的html报告放到指定文件夹,这样就能用jenkins去读出指定文件夹的报告了。一、构建后操作1.前面执行完测试用例后,可以用“添加构建后操作步骤”,读出html报告文件2.如果你的展开后有Publish THML reports这_jenkins + python + publish html reports

推荐文章

热门文章

相关标签