linux内核panic/oops/crash分析(addr2line,objdump,gdb)

原创 2017年12月01日 16:23:57
panic、oops、crash都是指linux kernel层发生了内核无法处理的异常。
应用层编程只会造成该进程的崩溃,内核层的编程如驱动代码中的异常最严重的情况会导致内核panic。
那怎样处理呢?
内核panic后有dump机制会打印出目前的所有寄存器,以便于分析异常原因。
我们经常用到的工具为addr2line,objdump,gdb
addr2line可以将出错代码地址转转换成代码所在文件所在行。
objdump可以将bin文件(内核就是vmlinux了)反编译成代码文本文件
gdb可以运行代码进行调试,可以看到更多的panic附近的信息,但对于偶发的panic就不起作用了

实例:
平台:高通SDM450
系统:android 8
linux版本:linux3.18
以一个人为制造的简单panic为例简单介绍一下上述工具的使用:
1,在kernel\drivers\spi\spidev.c驱动的__init函数中添加空指针赋值,如下:

2,运行后看到panicde的log,其中有PC已经解析出了出错位置spidev_init+0x28/0x1f8
另外重点需要关注的就是pc、lr指针(pc:当前CPU运行位置,lr:函数返回地址,以定位函数被调关系)

3,android系统使用的交叉编译工具链上这三个工具分别为
prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/arm-linux-androideabi-addr2line
prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/arm-linux-androideabi-objdump
prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-gdb

3.1,addr2line

3.2,objdump
arm-linux-androideabi-objdump -S vmlinux >obj.txt
在得到的反汇编文件中找到指定位置:

上述命令需要执行很久,得到的文件也十分大,可以指定起始、结束地址,只反汇编一小部分就会很快了:
arm-linux-androideabi-objdump -S --start-address=0xc153b944 --stop-address=0xc153b964  vmlinux >obj_partition.txt
3.3,gdb

gdb中使用b指令也可以看到出错代码位置,若需要调试要编译带调试信息的kernel,暂未测试。


版权声明:本文为博主原创文章,未经博主允许不得转载。如本文对您有帮助,欢迎点赞评论。

根据内核Oops 定位代码工具使用— addr2line 、gdb、objdump

(这三种工具都在out/host/linux-x86目录下) 内核开发时有时候出现Oops,例如一个野指针会导致内核崩溃,如运行时出现以下log:现在有三种方法可以找出具体出现野指针的地方 [p...

linux内核调试工具 oops ksymoops objdump

关于oops的文章,为了以后察看转载了。感谢原文作者。 1. OOPS 什么是OOPS呢? 假如写过linux模块或linux驱动,对于OOPS并不陌生, 当模块程式出现错误时, 终端会打印出...

Linux内核的Oops与Linux Kernel Panic报错解决思路

Linux内核还有没有给我们留下其他的有用信息。 Oops: 0002 [#1] 这里面,0002表示Oops的错误代码(写错误,发生在内核空间),#1表示这个错误发生一次。 Oops的错误...
  • yuyin86
  • yuyin86
  • 2013年10月27日 10:30
  • 2925

gdb 和 addr2line 调试 crash(包含如何调试so里面的crash)

嵌入式编程中会遇到各种crash的问题。 对于这样的问题,有两种调试方法: addr2line  和 gdb。   第一章   先讲解下gcc 编译加不加 -g 对程序的影响, 还有strip。 /...
  • sunny04
  • sunny04
  • 2014年12月12日 21:01
  • 3095

linux程序调试命令addr2line之入门简介(本文先不聊gdb调试)

addr2line有什么作用呢? 可别小瞧它, 它可以定位到代码出错的位置。 下面, 我们来看看这个简单的代码: #include int main() { int *p = NU...
  • stpeace
  • stpeace
  • 2015年06月23日 23:07
  • 1861

objdump & nm & addr2line

1. objdump objdump 命令是Linux下的反汇编目标文件或者可执行文件的命令. a. 反汇编test文件中需要执行指令的section objdump –d test b. 反...
  • rongc5
  • rongc5
  • 2013年08月09日 12:01
  • 931

LINUX内核调试相关--oops信息的定位2

Ø  实验目的与意义 1 、掌握printk 的使用、设置及实现原理,理解分级别进行打印log 信息的实现方法 2 、掌握如何分析oops 的方法 3 、掌握strace 工具的移植和使用方...

Linux内核移植 part2:uboot load_addr 释疑

uboot bootm在寻找OS镜像的时候会根据load_addr变量去对应的ram地址中找。/* common/image.c */ ulong genimg_get_kernel_addr_fit...
  • abcamus
  • abcamus
  • 2016年12月26日 12:58
  • 904

Linux的oops内核调试信息 && Linux Kernel Panic报错解决思路

Oops可以看成是内核级的Segmentation Fault。应用程序如果进行了非法内存访问或执行了非法指令,会得到Segfault信号,一般的行为是coredump,应用程序也可以自己截获Segf...

gdb调试core dump入门实践(顺便复习一下之前介绍过的addr2line命令调试)

调试技能是软件开发的必备技能, 不会调试, 就抓不到bug, 就很痛苦。 本文我们来一起聊聊gdb调试core          Part 1:         在前面的博文中, 我们聊过重要的a...
  • stpeace
  • stpeace
  • 2015年11月13日 23:21
  • 3524
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux内核panic/oops/crash分析(addr2line,objdump,gdb)
举报原因:
原因补充:

(最多只允许输入30个字)