linux内核挂死,用crash工具分析Linux内核死锁的一次实战分享

本文简介:

内核死锁问题一般是读写锁(rw_semaphore)和互斥锁(mutex)引起的,本文主要讲如何通过ramdump+crash工具来分析这类死锁问题。

0、背景知识点

ramdump是内存转存机制,我们可以在某个时刻把系统的内存转存到一个文件中,然后与符号信息(vmlinux)一起导入到trace32或crash等内存分析工具中做离线分析。是分析崩溃、死锁、内存泄露等内核疑难问题的重要调试手段。

crash是用于解析ramdump的开源工具(http://people.redhat.com/anderson/),是命令行式的交互模式,提供诸多功能强大的调试命令,是分析定位内核复杂问题的利器。

死锁是指两个或两个以上的执行流在执行过程中,由于竞争锁资源而造成的一种阻塞的现象。如图:

95af968dc628d9447a3ab69254302f60.png

1、问题描述

在Android7.1系统中跑monkey时出现界面卡死现象:

1)没有任何刷新,所有输入事件无效,包括电源键

2)watchdog没有重启system_server

3)可以连adb,但ps等调试命令卡住

2、初步分析

由于无法直接用adb调试,用长按电源键的方式进入dump模式并导出ramdump文件,之后再用crash工具载入randump文件开始离线分析。

一般卡死时可能是因为核心线程处在UNINTERRUPTIBLE状态,所以先在crash环境下用ps命令查看手机中UNINTERRUPTIBLE状态的线程,参数-u可过滤掉内核线程:

ef03db81294c045f6be0944df0c563c9.png

bt命令可查看某个线程的调用栈,我们看一下上面UN状态的最关键的watchdog线程:

abf2e84ceb57f202e5098b2c20a93b87.png

从调用栈中可以看到proc_pid_cmdline_read()函数中被阻塞的,对应的代码为:

ce36690deb69f350e17b09aa9e6b99d4.png

这里是要获取被某个线程mm的mmap_sem锁,而这个锁又被另外一个线程持有。

3、推导读写锁

要想知道哪个线程持有了这把锁,我们得先用汇编推导出这个锁的具体值。可用dis命令看一下proc_pid_cmdline_read()的汇编代码:

a6ffe21f4c643046639f7e3c8fd7a6a7.png

0xffffff99a680aaa0处就是调用down_read()的地方,它的第一个参数x0就是sem锁,如:

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值