Linux内核奔溃分析

前言

最近遇到一个kernel奔溃的问题,错误日志开头一部分如下:

[  355.262451@0] Unhandled fault: external abort on non-linefetch (0x008) at 0xfe004328
[  355.264547@0] Internal error: : 8 [#1] PREEMPT SMP ARM
[  355.269632@0] Modules linked in: audio_data mali aml_thermal otz_client(O)
[  355.276449@0] CPU: 0 PID: 287 Comm: sh Tainted: G           O 3.10.33 #1
[  355.283088@0] task: d9356400 ti: da42a000 task.ti: da42a000
[  355.288616@0] PC is at dbg_do_command+0x214/0x550
[  355.293267@0] LR is at dbg_do_command+0x1ec/0x550
[  355.297924@0] pc : [<c002b694>]    lr : [<c002b66c>]    psr: 800b0113
[  355.297924@0] sp : da42bf00  ip : 00000030  fp : 00000000
[  355.309652@0] r10: dabe930c  r9 : da42bf80  r8 : fe004328
[  355.314999@0] r7 : 00000030  r6 : dac70680  r5 : 00000010  r4 : c090b4bc
[  355.321641@0] r3 : 00000000  r2 : fe004328  r1 : fe004328  r0 : fe004328
[  355.328283@0] Flags: Nzcv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment user
[  355.335528@0] Control: 10c5387d  Table: 1a62c04a  DAC: 00000015
[  355.341395@0]

对于没有debug经验的人来讲,这段东西其实看得是一头雾水。”external abort on non-linefetch“这是个什么错误呢?网上找到了一个参考链接:http://www.it1352.com/230717.html

这个错误大概是因为试图读取未映射(通过MMU)的内存,按我的理解就是访问了非法的内存地址或者说这个内存地址根本不存在。不管怎么样,反汇编一下看看大概原因吧。

正文

1、首先我们要反汇编一下vmlinux

命令如下:

arm-linux-gnueabihf-objdump -D vmlinux > vmlinux.dis

2、再看一下错误日志的信息:

[  355.288616@0] PC is at dbg_do_command+0x214/0x550
[  355.293267@0] LR is at dbg_do_command+0x1ec/0x550
[  355.297924@0] pc : [<c002b694>]    lr : [<c002b66c>]    psr: 800b0113

内核是奔溃在dbg_do_command函数的0x214偏移处,也就是地址0xc002b694的地方,另外0x550是dbg_do_command函数的大小,这个我们暂且不用理会。而lr寄存器保存了返回的地址,也就是地址0xc002b66c。我们用c002b694地址在vmlinux.dis里面搜索一下,得到以下结果:

c002b68c:   ea000083    b   c002b8a0 <dbg_do_command+0x420>
c002b690:   f57ff05f    dmb sy
c002b694:   e5903000    ldr r3, [r0]
c002b698:   e3570030    cmp r7, #48 ; 0x30

3、从上面一步,我们可以看到出错的地方是一条读取指令:

ldr r3, [r0]

我们再看一下出错时候各寄存器的值:

[  355.297924@0] sp : da42bf00  ip : 00000030  fp : 00000000
[  355.309652@0] r10: dabe930c  r9 : da42bf80  r8 : fe004328
[  355.314999@0] r7 : 00000030  r6 : dac70680  r5 : 00000010  r4 : c090b4bc
[  355.321641@0] r3 : 00000000  r2 : fe004328  r1 : fe004328  r0 : fe004328

我们可以看到这时候,r0=fe004328,r3=00000000。r3寄存器没什么问题,那就是访问内存地址0xfe004328出现这个错误了。这个地址是芯片商FAE告诉我的,它是一个寄存器的地址,可以通过设置它来打开展频功能。我将这个错误反馈给他们,查实后原来他们给错地址值了,囧!所以当然是访问了非法地址咯。

结语

上面的分析是常规的流程,我也没啥经验,就当做给自己做个记录吧。也希望给遇到同样错误的同学提供一个思路方向。

往期好文:

抽奖!可能会迟到,但从不会缺席

普通人的节奏


  回复「 篮球的大肚子」进入技术群聊

回复「1024」获取1000G学习资料

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467933.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DataGridView带图标的单元格实现

目的&#xff1a; 扩展 C# WinForm 自带的表格控件&#xff0c;使其可以自动判断数据的上下界限值&#xff0c;并标识溢出。 这里使用的方法是&#xff1a;扩展 表格的列 对象&#xff1a;DataGridViewColumn。 1.创建类&#xff1a;DataGridViewDecimalCheckCell.cs public cl…

包与模块管理及面向对象初步

模块 文章目录模块指令原因步骤搜索范围加目录面向对象编程封装实现初始化函数![在这里插入图片描述](https://img-blog.csdnimg.cn/20200201081513814.png?x-oss-processimage/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80M…

spring生命周期七个过程_Spring杂文(三)Spring循环引用

众所周知spring在默认单例的情况下是支持循环引用的Appconfig.java类的代码Configurable ComponentScan("com.sadow") public class Appconfig { }X.java类的代码Component public class X {AutowiredY y;public X(){System.out.println("X create");} }Y.…

Linux 系统中的dvfs功能

前言最近硬件的同事需要我们提供的版本能动态调频&#xff0c;何为动态调频呢&#xff1f;对于CPU来讲&#xff0c;功耗和性能是一对不可调和的矛盾&#xff0c;通过调整CPU的电压和频率&#xff0c;可以在功耗和性能之间找一个平衡点。由于调整是在系统运行的过程中&#xff0…

Android系统下内存使用情况与监测

(0). Android/Linux 内存分配的两个重要策略.Linux 在分配内存时, 为了节省内存, 按需分配, 使用了延时分配以及Copy-On-Write 的策略.延时分配即针对user space 申请memory 时, 先只是明面上的分配虚拟空间, 等到真正操作memory 时, 才真正分配具体的物理内存, 这个需要借助…

node进阶| 解决表单enctype=multipart/form-data 时获取不到Input值的问题

今天在学习node踩到一个坑&#xff1a;form设置enctype"multipart/form-data"上传文件时&#xff0c;无法获取到表单其他input的值。 因为之前上传文件用的是 formidable 方法1&#xff1a;formidable &#xff08;无法获取其他input的值&#xff09; 引包 app.js v…

错误异常处理 小数格式化,取证与四舍五入 random处理 日期与时间常用操作

异常处理 文章目录异常处理语法错误语义错误逻辑错误异常处理finallytryecceptfinallyraise测试unittest测试组织代码常用断言方法是否正确存在约等于判断是否应用判断是否为空判断是否为某型实例判断大于类与测试装置setup函数teardown函数小数格式化&#xff0c;取证与四舍五…

什么是内存泄漏?

在wikipedia这样解读内存泄漏的&#xff1a;在计算机科学中&#xff0c;内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上的消失&#xff0c;而是应用程序分配某段内存后&#xff0c;由于设计错误&#xff0c;导致在释放该段内存之前就…

requests库之处理响应

response对象&#xff1a; http状态码 利用response把流存储成图片或者文件 一个下载图片的实例 import requestsdef download_pic():#headers {User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.109 Safari/537.36…

持久化概述

持久化概述 文章目录持久化概述对象持久化扁平文件pickleshelve数据库ORM扁平文件保留类型还原eval字符串转列表&#xff08;不带&#xff0c;&#xff09;![](https://img-blog.csdnimg.cn/20200201211443931.png?x-oss-processimage/watermark,type_ZmFuZ3poZW5naGVpdGk,sha…

五分钟读懂TCP 协议

TCP 是互联网核心协议之一&#xff0c;本文介绍它的基础知识。一、TCP 协议的作用互联网由一整套协议构成。TCP 只是其中的一层&#xff0c;有着自己的分工。&#xff08;图片说明&#xff1a;TCP 是以太网协议和 IP 协议的上层协议&#xff0c;也是应用层协议的下层协议。&…

正则表达

文章目录正则表达数据验证字面值\d查数字^\w特殊符号匹配规则.除|n所有字符\d查数字\D非数字![在这里插入图片描述](https://img-blog.csdnimg.cn/20200203213049246.png)\s空白字符![在这里插入图片描述](https://img-blog.csdnimg.cn/20200203213145246.png)\S非空白字符![在…

《从三月开始……》

很多时候&#xff0c;我们对不同现状有所不满——对无法冲破的工作瓶颈不满对久不增长的收入不满对久不下降的体重不满对无法提高的学分不满对没有进展的关系不满……似乎总有某个方面的不顺给我们带来烦恼为此&#xff0c;我们也做了“努力”——我们通过各种渠道和平台去查阅…

从未知到2019年的文章汇总

2018年下半年我正式把这个遗弃了很久的微信号运营起来&#xff0c;2019年应该是比较正式的一年&#xff0c;也是成长最快的一年。从开始捣鼓微信公众号到现在&#xff0c;我写了很多东西。这篇文章把之前写过的&#xff0c;不管是好的&#xff0c;还是不好的&#xff0c;都整理…

Binder远程转本地

前言在[031]Binder线程栈复用中&#xff0c;我们说到Binder驱动通过“线程栈复用”减少线程数&#xff0c;我们来讲一讲另外一个机制“远程转本地”&#xff0c;将远程Binder调用转化成本地方法调用。一、写个Demointerface IServiceB {void sendMsg(String msg); }1.1 Client…

存储对手机性能的影响

前言几年以前&#xff0c;我被派去厦门上门去分析一个用户的手机卡顿问题&#xff0c;该用户的手机经常莫名无响应&#xff0c;刷机&#xff0c;恢复出厂都没有用&#xff0c;经过一通分析&#xff0c;原来该用户从熟人店里买到了一张盗版的SD卡&#xff08;这年头坑的就是朋友…

进阶攻略|前端最全的框架总结

前端的技术日渐更新&#xff0c;最近得空&#xff0c;花了一上午的时间&#xff0c;将前端常见的UI框架总结了一下&#xff0c;在开发的过程之中&#xff0c;有了这些&#xff0c;不断能够提高自己的工作效率&#xff0c;还可以在工作之余了解更多。希望大家喜欢。1.Layui官方网…

你知道char *s和char s[]的区别吗?

在一个夜深人静的晚上&#xff0c;有一个读者给我发了一个C语言题目。他问我&#xff0c;发哥&#xff0c;帮我看看这个代码有什么问题。我看了代码之后&#xff0c;心里一阵恐慌。我自认为我不是C语言高手。但我确实是一个喜欢解决问题的男人。就是在这样的背景驱使下&#xf…

上Google Adsense个人的一点体验

最近我想开通一个Google Adsense帐号&#xff0c;因为以前注册过一个Google帐号&#xff0c;所以我以为两个是可以共通的&#xff0c;因为很久没上Google帐号&#xff0c;我记不太清密码了&#xff0c;所以我先是登录了Google&#xff0c;登上去了&#xff0c;密码没记错。然后…

通俗易懂,嵌入式Linux驱动基础

前言上一篇分享的&#xff1a;《从单片机工程师的角度看嵌入式Linux》中有简单提到Linux的三大类驱动&#xff1a;我们学习编程的时候都会从hello程序开始。同样的&#xff0c;学习Linux驱动我们也从最简单的hello驱动学起。驱动层和应用层 还记得实习那会儿我第一次接触嵌入式…