声明:本文是真实案例分析,而非crash分析工具使用说明,不熟悉相关工具的同学,请参考官方文档

1、问题现场:

Unable to handle kernel NULL pointer dereference at virtual address 00000001
Mem abort info:
  Exception class = DABT (current EL), IL = 32 bits
  SET = 0, FnV = 0
  EA = 0, S1PTW = 0
Data abort info:
  ISV = 0, ISS = 0x00000006
  CM = 0, WnR = 0
user pgtable: 4k pages, 39-bit VAs, pgd = ffffffc03c784000
[0000000000000001] *pgd=00000000070f8003, *pud=00000000070f8003, *pmd=0000000000000000
Internal error: Oops: 96000006 [#1] PREEMPT SMP
Modules linked in:
CPU: 0 PID: 1948 Comm: pt-osd Not tainted 4.14.61-00003-g8d661a5-dirty #39
Hardware name:
task: ffffffc031325700 task.stack: ffffff800cc50000
PC is at i2c_dw_isr+0x4fc/0x654
LR is at i2c_dw_isr+0x428/0x654
pc : [<ffffff80086c0f70>] lr : [<ffffff80086c0e9c>] pstate: 604001c9
sp : ffffff8008003e10
x29: ffffff8008003e10 x28: 000000000000ff80
x27: 0000000000000000 x26: 0000000000000001
x25: 0000000000000400 x24: ffffff800c34b7f8
x23: 0000000000000001 x22: ffffff8008fb1000
x21: 0000000000000010 x20: 00000000ffff0081
x19: ffffffc03e170018 x18: 000000000000671f
x17: 0000007f80918620 x16: 0000007f80c54698
x15: 0000000000001d55 x14: 0000000000000000
x13: 0000000000000000 x12: 0000000000000000
x11: 0000000000000000 x10: 0000000000000000
x9 : 0000000000000000 x8 : ffffff80086c10c8
x7 : 0000000000000001 x6 : 0000000000000400
x5 : 0000000000000c34 x4 : 0000000000000065
x3 : 0000000000000001 x2 : 0000000000000000
x1 : 0000000000000000 x0 : 0000000000000000

X19: 0xffffffc03e16ff98:
ff98  00000000 00000000 57d3a303 00000000 08ae0e10 ffffff80 00000000 00000000
ffb8  00001000 00000000 00000000 00000000 08f0a328 ffffff80 000044ae 00000001
ffd8  81a40052 00000000 00000000 00000000 00000000 00000000 00000000 00000000
fff8  00000000 00000000 3e04ee00 ffffffc0 0474a698 ffffffc0 08559eb0 ffffff80
0018  0474a410 ffffffc0 09105000 ffffff80 00000000 00000000 91e791e7 00000000
0038  0c34b778 ffffff80 0c34b778 ffffff80 3e04e980 ffffffc0 00000000 00000000
0058  00000000 00000000 086c1978 ffffff80 00000000 00000000 00000000 00000000
0078  0c34b888 ffffff80 00000001 00000000 00000000 00000000 0c34b9a7 ffffff80

Process pt-osd (pid: 1948, stack limit = 0xffffff800cc50000)
Call trace:
Exception stack(0xffffff8008003cd0 to 0xffffff8008003e10)
3cc0:                                   0000000000000000 0000000000000000
3ce0: 0000000000000000 0000000000000001 0000000000000065 0000000000000c34
3d00: 0000000000000400 0000000000000001 ffffff80086c10c8 0000000000000000
3d20: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
3d40: 0000000000000000 0000000000001d55 0000007f80c54698 0000007f80918620
3d60: 000000000000671f ffffffc03e170018 00000000ffff0081 0000000000000010
3d80: ffffff8008fb1000 0000000000000001 ffffff800c34b7f8 0000000000000400
3da0: 0000000000000001 0000000000000000 000000000000ff80 ffffff8008003e10
3dc0: ffffff80086c0e9c ffffff8008003e10 ffffff80086c0f70 00000000604001c9
3de0: ffffff8008003e10 ffffff80086c0b90 0000007fffffffff 0000000000000001
3e00: ffffff8008003e10 ffffff80086c0f70
[<ffffff80086c0f70>] i2c_dw_isr+0x4fc/0x654
[<ffffff8008106a28>] __handle_irq_event_percpu+0x7c/0x148
[<ffffff8008106bc8>] handle_irq_event+0x58/0xc0
[<ffffff800810a740>] handle_fasteoi_irq+0x98/0x180
[<ffffff8008105ad8>] generic_handle_irq+0x24/0x38
[<ffffff8008106220>] __handle_domain_irq+0x60/0xac
[<ffffff8008081384>] gic_handle_irq+0x104/0x1c4
Exception stack(0xffffff800cc53ec0 to 0xffffff800cc54000)
3ec0: 0000000000000035 0000007f2408bee0 0000000000000000 0000007f24000030
3ee0: 0000000000000000 0000007f240cbf60 0000007f2408a2d0 0000000000000001
3f00: 00000021000001bd 000001be0001f0be 0000000000000071 0000007f24000778
3f20: 0001f0bb00000021 00000021000001bb 0000000000000000 0000000000001d55
3f40: 0000007f80c54698 0000007f80918620 000000000000671f 0000007f2408bef0
3f60: 0000007f2408bec0 0000007ea56fa680 0000007ea56fa680 00000000007e9000
3f80: 0000007ea56fa750 0000000000000d24 000000000000003a 0000007ea56fa670
3fa0: 0000000000000002 0000007ea56fa510 0000007f806f43c0 0000007ea56fa510
3fc0: 0000007f80918648 0000000060000000 0000000000000009 00000000ffffffff
3fe0: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
[<ffffff80080833f8>] el0_irq_naked+0x50/0x58
Code: 6b1f037f 32160026 1a8110c1 3707fc85 (394002e5)
---[ end trace 9acff67b837bbb81 ]---
Kernel panic - not syncing: Fatal exception in interrupt
SMP: stopping secondary CPUs
oops, flush dcache for cpu3
oops, flush dcache for cpu2
oops, flush dcache for cpu1
Kernel Offset: disabled
CPU features: 0x0a02a38
Memory Limit: none
panic_handler:kernel panic:0.

2、分析问题思路

1)首先通过PC,查看对应的汇编代码

crash_arm64> dis -l ffffff80086c0f70
drivers/i2c/busses/i2c-designware-master.c: 336     0xffffff80086c0f70 <i2c_dw_isr+1276>:   ldrb    w5, [x23]

对应一个ldr指令,地址是x23,但发现x23:0000000000000001,与上面问题现场Unable to handle kernel NULL pointer dereference at virtual address 00000001刚好吻合。

2)分析i2c_dw_isr()对应的汇编代码,发现x19寄存器就是struct dw_i2c_dev结构体指针,x23寄存器是struct i2c_msg结构体buf成员指针,x24寄存器是struct i2c_msg结构体指针

crash_arm64> struct i2c_msg ffffff800c34b7f8 -x
struct i2c_msg {
  addr = 0xb888,
  flags = 0xc34,
  len = 0xff80,
  buf = 0x1 <Address 0x1 out of bounds>
}
crash_arm64>

3)但是从x19寄存器来看,msgs指针好像和x24寄存器值不相同

crash_arm64>
crash_arm64> struct dw_i2c_dev.msgs ffffffc03e170018
  msgs = 0xffffff800c34b888
crash_arm64>

crash_arm64> rd ffffff800c34b7f8 -x
ffffff800c34b7f8:  ffffff800c34b888
crash_arm64>

4)从这里看出x24指向的struct i2c_msg结构体内容,居然是当前struct i2c_msg结构体指针

5)为了弄清楚执行i2c_dw_isr()时struct i2c_msg结构体真实内容,故在开机时预先申请了一个struct dw_i2c_dev结构体和struct i2c_msg结构体空间,当代码执行到i2c_dw_isr()时,拷贝当时的struct dw_i2c_dev结构体和struct i2c_msg结构体内容

6)比较两者发现,只有cmd_complete和msgs不同,其余均相同,故怀疑是进程同步问题,而非DDR跳变,或者踩内存问题

怀疑进程同步理由:

cmd_complete.wait.lock.rlock.raw_lock.owner,两者的值只相差1,说明是两次连续的i2c_transfer()

7)由于平台使用SMP,有没有一种可能是cpu0在执行中断处理程序,而另外一个CPU在发起I2C访问呢?

crash_arm64> struct dw_i2c_dev.adapter.bus_lock ffffffc03e170018
  adapter.bus_lock = {
    wait_lock = {
      raw_lock = {
        owner = 0,
        next = 0
      }
    },
    waiters = {
      rb_root = {
        rb_node = 0x0
      },
      rb_leftmost = 0x0
    },
    owner = 0xffffffc03df20000
  },
crash_arm64>

crash_arm64> task 0xffffffc03df20000
PID: 1750   TASK: ffffffc03df20000  CPU: 3   COMMAND: "jmfserver"
struct task_struct {
  thread_info = {
    flags = 8,
    addr_limit = 549755813887,
    ttbr0 = 32989184,
    preempt_count = 2
  },
  state = 2,
  stack = 0xffffff800c348000,

crash_arm64> bt 1750
PID: 1750   TASK: ffffffc03df20000  CPU: 3   COMMAND: "jmfserver"
 #0 [ffffff800c34b590] __switch_to at ffffff8008085df0
 #1 [ffffff800c34b5b0] __schedule at ffffff8008aa54ac
 #2 [ffffff800c34b640] schedule at ffffff8008aa5a24
 #3 [ffffff800c34b660] schedule_timeout at ffffff8008aa90e4
 #4 [ffffff800c34b700] wait_for_common at ffffff8008aa6890
 #5 [ffffff800c34b790] wait_for_completion_timeout at ffffff8008aa696c
 #6 [ffffff800c34b7a0] i2c_dw_xfer at ffffff80086c1748
 #7 [ffffff800c34b7e0] __i2c_transfer at ffffff80086bc164
 #8 [ffffff800c34b830] i2c_transfer at ffffff80086bc338
 #9 [ffffff800c34b860] i2c_master_send at ffffff80086bc3d8
#10 [ffffff800c34b8a0] regmap_i2c_write at ffffff8008575584
#11 [ffffff800c34b8c0] _regmap_raw_write at ffffff80085716bc
#12 [ffffff800c34b930] regmap_bulk_write at ffffff8008571e60
从上面来看,的确存在这种情况。

8)在修改msgs成员处添加相应锁保护,问题不再复现

linux crash分析案例之进程同步相关推荐

  1. crash分析linux内核崩溃转储文件vmcore

    文章目录 一.调试环境准备 二.使用crash分析vmcore 1.bt命令 2.log命令 3.dis命令 4.mod命令 5.sym命令 6.ps命令 7.files命令 8.vm命令 9.tas ...

  2. 《Linux企业应用案例精解》一书已由清华大学出版社出版

    <Linux企业应用案例精解>简介 本书同时被×××国家科学图书馆.中国国家图书馆.首都图书馆.清华大学.北京大学等上百所国内综合性大学图书馆收录为馆藏图书,2013年本书远销到中国台湾地 ...

  3. c++ dump某个变量_linux内核调试之 crash分析dump文件

    Linux 下也有众多的内存转储分析工具,lcrash.Alicia.Crash.Crash 是由 Dave Anderson 开发和维护的一个内存转储分析工具,目前它的最新版本是 5.0.0. 在没 ...

  4. Android Native crash 处理案例分享

    简介:Android Native crash 处理案例分享 1. 背景 目前 mPaas[1] Android使用Crash SDK对闪退进行的处理,CrashSDK 是 Android 平台上一款 ...

  5. Linux系统故障处理案例(一)【转】

    2016-08-05 14:41 运行环境:CentOS6.7 故障原因: 昨天在线执行命令yum -y update 在命令执行途中,强制中断并直接运行poweroff命令关机.再次开机出现如图所示 ...

  6. android crash分析工具,Android Crash之Native Crash分析

    前言 上一篇给大家介绍了Android Crash中的Java Crash分析,我们可以知道Java Crash一般会弹出提示框告诉我们程序崩溃了,通常使用Crash工具都能够捕获到:本篇博客来谈谈如 ...

  7. Linux性能分析工具汇总

    Linux针对性能调优设计了许多分析工具,这些工具对于分析整个系统性能可提供巨大的帮助.影响性能的因素有cache.I/O,系统调用,系统内核.CPU性能等等.比如某些程序无法充分利用 cache,从 ...

  8. 2022最火的Linux性能分析工具--perf

    ►►► 介绍 perf是Linux性能分析中,比较常用的一款工具.它基于时间采集原理,以性能事件为基础,支持针对CPU处理器相关性能指标与操作系统相关性能指标的性能分析.常被用来查找.定位源码级性能问 ...

  9. 《Unix/Linux日志分析与流量监控》书稿完成

    <Unix/Linux日志分析与流量监控>书稿完成 近日,历时3年创作的75万字书稿已完成,本书紧紧围绕网络安全的主题,对各种Unix/Linux系统及网络服务日志进行了全面系统的讲解,从 ...

最新文章

  1. 关于BFD(双向转发检测)开发的总结
  2. linux虚拟机保存指令,vmware虚拟机命令保存
  3. VTK:可视化之Follower
  4. 二.编写第一个c#程序(注释,命名空间,类,Main方法,标识符,关键字,输入,输出语句,)...
  5. Python进阶|聊聊异常处理
  6. sklearn中的Linear_model的score函数讲解
  7. 【操作系统】死等状态、忙等状态、有限等待、让权等待
  8. 【C语言】22-枚举
  9. 一些有用的书签网站整理
  10. springboot 中jsp乱码设置
  11. 《Adobe Photoshop CS6中文版经典教程(彩色版)》目录—导读
  12. 【K站神器】百度SEO尊诺发包程序
  13. Vue directives 自定义局部指令中调用 method 中的方法
  14. 在Excel Power Query中提取数据
  15. Ubuntu的常用命令总结——简单版
  16. 初始化磁盘选哪个格式 初始化磁盘分区形式选什么好
  17. 什么是跨域?以及跨域的解决方案!
  18. 初识GeneXus产品
  19. 常用db与倍数的关系
  20. 为什么要研究大数据?

热门文章

  1. 设计张程序员专用壁纸
  2. 程序员喜爱的壁纸,需要自取
  3. 微信小程序使用crypto.js加密解密
  4. Dubbo源码分析:全集整理
  5. Nginx配置基于IP的访问控制
  6. [C] 数组指针、指针数组及数组传参
  7. 目标检测:PASCAL VOC 数据集简介
  8. adb 指令uninstall卸载android app 处理方法
  9. Android开发 ConstraintLayout布局的详解
  10. attention机制、self-attention、channel attention、spatial attention、multi-head attention、transformer