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

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

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

#include 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是程序文件名。执行程序,结果程序异常中断。查看系统dmesg信息,发现系统日志的错误信息:

[54106.016179] test1[8352] trap divide error ip:400506 sp:7fff2add87e0 error:0 in test1[400000+1000]

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

$ addr2line -e test1 400506

out: /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毁尸灭迹了

linux 进程崩溃log,linux调试:dmesg 查看程序崩溃原因分析方法之一相关推荐

  1. 高效管理 Linux 进程:如何后台执行程序、查看进程、终止任务

    目录 前言 一.nohup命令详解 1-1.nohup命令介绍 1-2.语法格式 1-2-1.基础语法介绍 1-2-2.执行脚本文件 1-2-3.执行python文件 1-2-4.拓展延申:在服务器上 ...

  2. linux进程管理机制,linux进程管理,linux进程管理机制

    linux进程管理,linux进程管理机制 一.基本介绍 1.在 LINUX 中,每个执行的程序(代码)都称为一个进程.每一个进程都分配一个 ID 号 2.每一个进程,都会对应一个父进程,而这个父进程 ...

  3. Linux 中ifconfig和ip addr命令查看不到ip解决方法

    Linux 中ifconfig和ip addr命令查看不到ip解决方法 参考文章: (1)Linux 中ifconfig和ip addr命令查看不到ip解决方法 (2)https://www.cnbl ...

  4. Linux进程线程学习笔记:运行新程序

    Linux进程线程学习笔记:运行新程序 周银辉 在上一篇中我们说到,当启动一个新进程以后,新进程会复制父进程的大部份上下文并接着运行父进程中的代码,如果我们使新进程不运行原父进程的代码,转而运行另外一 ...

  5. 在Linux执行命令报错”Arg list too long”的原因分析

    http://www.yunweipai.com/archives/558.html 在Linux执行命令报错"Arg list too long"的原因分析 吞拿鱼手卷 于 3 ...

  6. linux 进程 状态 ri,LINUX下解决netstat查看TIME_WAIT状态过多问题(转)

    # netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c 16 CLOSING 130 ESTABLISHED 298 FIN_WAIT1 13 FIN_WA ...

  7. linux 进程管理 ppt,linux操作系统-进程管理和打印管理.ppt

    <linux操作系统-进程管理和打印管理.ppt>由会员分享,可在线阅读,更多相关<linux操作系统-进程管理和打印管理.ppt(25页珍藏版)>请在装配图网上搜索. 1.进 ...

  8. linux 进程自重启,linux 进程监控和自动重启的简单实现

    目的:linux 下服务器程序会因为各种原因dump掉,就会影响用户使用,这里提供一个简单的进程监控和重启功能. 实现原理:由定时任务crontab调用脚本,脚本用ps检查进程是否存在,如果不存在则重 ...

  9. linux进程操作相关函数,Linux进程控制简介与要素及相关函数详解

    进程是操作系统中的一个重要概念,它是一个程序的一次执行过程,程序是进程的一种静态描述,系统中运行的每一个程序都是在它的进程中运行的. 进程4要素 要有一段程序供该进程运行 进程专用的系统堆栈空间 进程 ...

最新文章

  1. SAP MM 采购附加费计入物料成本?
  2. Selenium+PhantomJS使用时报错原因及解决方案
  3. 《WEB渗透一.信息收集》
  4. 软件测试 学习之路 CSS(一)
  5. java书籍_Java学习必备书籍(快来收藏)
  6. Key-Value Coding (KVC)
  7. 二、Nginx 反向代理配置初学个人理解
  8. Linux: kill
  9. GitHub GraphQL API已正式可用
  10. 如何在delphi里面控制Edit只能输入数字
  11. 屏幕控制实现消息发送以及轰炸
  12. 单片机c语言试题和答案,(完整版)单片机试卷及答案
  13. win10外放与耳机不能够自动切换没有声音的问题 声卡问题
  14. Android音频系统之音频框架
  15. 【元胞自动机】基于matlab元胞自动机地铁火灾疏散模型【含Matlab源码 246期】
  16. 为何提示网站安全证书有问题?不同原因下,如何解决?
  17. GMC解封秘籍:解决 Google 账户被封窘境
  18. Windows 11 找不到文件C:\ProgramData\Package Cache\{xxxx}xxx.exe。请确定文件名是否正确后,再试一次。
  19. Arduino 入门学习笔记5 按键控制激光发生器
  20. java处理器,JAVA注解处理器

热门文章

  1. Java基础学习总结(92)——Java编码规范之排版、注释及命名
  2. 算法学习总结(1)——基本数据结构
  3. stm32可以移植linux系统吗,如何在STM32上移植Linux?超详细的实操经验分享
  4. oracle除了什么之外,Oracle翻译
  5. aliyun gradle 代理_android studio gradle国内代理设置
  6. php删除树结构文件,树型结构列出目录中所有文件的php代码
  7. 默认权限umask、文件系统权限、特殊权限
  8. Linux系统基础(二)
  9. linux系统组成之小型RedHat little linux制作二
  10. WCF使用Json传输的一个BUG