[Kernel_exception6] MTK hang_detect

一、hang_detect介绍:

  MTK平台存在一个hang_detect的机制,用于检查应用层和驱动是否有卡住,应用层的system_server进程会

30s喂狗,也就是对kernel driver中的watchdog节点进行kick的操作,当kernel 里面的watchdog线程卡住时,或者

应用层发生SWT时不能及时喂狗,都会出现hang_detect的问题,出现问题时会有一定的等待时间重启,不同的

等待时间具有不同的意义:

  1. 正常情况下,watchdog thread tick 300s, 对应count=10.
  2. watchdog 检测到hang 30s, 在dump backtrace 前,tick 360s, 对应count=12.
  3. 在SWT 发生的情况下,tick 420s, 对应count=14.
  4. 在SWT 发生, 抓取完AEE DB 后, tick 330s, 对应count=11.
  5. 在 Surfaceflinger/SystemServer 发生Native Exception, tick 600s, 对应count=20.
  6. 在 Surfaceflinger/SystemServer 发生Native Exception后, 并且我司AEE开始抓取coredump, tick 1200s, 对应count=40.
  7. 在 Surfaceflinger/SystemServer 发生Native Exception, 并且我司AEE抓取完coredump后, tick 570, 对应count=19.

二、具体问题分析:

  下面来看实际项目中遇到的一个问题,通过如下log可以看出发生了hang_detect重启,并且重启的count=10,

说明问题可能发生在重启前的300S:

[  451.448876]
<think>我们正在分析MTK平台上的hang_detect问题。根据提供的引用,hang_detectMTK的一种机制,用于检测系统是否卡住(hang),并在检测到时主动重启手机。引用中出现了两种场景:一种是hang_detect线程本身出现问题(引用1),另一种是hang_detect检测到上层应用(如system_server)卡住而主动触发重启(引用2)。分析步骤:1.**理解hang_detect机制**:hang_detectMTK在Linux内核中实现的一个线程,它定期检查关键进程(如init、surfaceflinger、system_server等)是否能够正常调度。如果某个关键进程在预定时间内没有调度(即“tick”没有更新),hang_detect会认为该系统已经挂起,并触发重启。2.**查看日志**:首先需要查看内核日志(dmesg或kmsg),搜索关键字“Hang_Detect”来获取hang_detect的行为记录。如引用1和引用2所示,日志会记录hang_detect检测的进程、倒计时的状态以及触发重启前的堆栈信息。3.**分析hang_detect触发的原因**:-如果是hang_detect线程本身出现问题(如引用1中的线程卡住),那么需要分析hang_detect线程的堆栈(如引用1中显示的PC和LR寄存器值)来定位问题。-如果是hang_detect检测到其他关键进程卡住(如引用2中的system_server),那么需要分析被检测进程的堆栈。引用2中,hang_detect在检测到system_ui卡住时,会打印“dumpsystem_uiallthreadbt”,即需要获取system_ui进程的所有线程的堆栈。4.**获取堆栈信息**:-当hang_detect检测到问题并打印堆栈时,需要在内核日志中查找对应的堆栈信息。这些信息可以帮助确定卡住的代码位置。-对于用户空间进程(如system_server),还可以通过tombstone或ANR日志来获取更详细的信息。5.**复现问题**:由于hang_detect问题通常难以复现,需要根据日志分析在什么条件下触发了hang_detect。可能需要长时间运行特定压力测试来复现。6.**代码分析**:根据日志中给出的函数地址(如引用1中的`hang_detect_thread+0x244`)或函数名,可以查看内核源码中hang_detect的实现,理解检测逻辑和可能的问题点。具体到引用1的问题:-日志显示hang_detect线程在`hang_detect_thread+0x244`处卡住,并且LR(返回地址)在`console_unlock+0x25c`,这可能是由于控制台输出锁竞争导致hang_detect线程被阻塞。具体到引用2的问题:-hang_detect检测到system_ui进程卡住,因此需要分析system_ui进程的堆栈,查看其所有线程的状态,找出卡住的线程和原因。因此,分析MTK平台hang_detect问题的基本步骤是:收集日志(特别是内核日志)->定位触发hang_detect的进程/线程->分析相关堆栈->结合代码理解原因。相关问题:1.如何获取MTK平台的内核日志?2.hang_detect机制在内核中的实现原理是什么?3.如何分析关键进程(如system_server)的卡死问题?</think>### 分析MTK平台hang_detect问题的步骤 #### 1. **定位触发时间点** - 查看内核日志中`[Hang_Detect]`标记的时间戳(如引用中的`451.448876`秒) - 确认问题发生前300秒内的系统活动(MTK默认检测窗口) - **关键命令**:`adb shell dmesg | grep "hang_detect"` #### 2. **分析线程状态** ```bash adb shell cat /proc/kmsg | grep -E "hang_detect|PC is at|LR is at" ``` - 关注线程状态字段(如`status 1`表示异常) - 检查PC/LR寄存器值(如`c06c8bbc`)定位卡死代码位置 - 识别被监控的关键进程: - `system_server` (Android核心服务) - `surfaceflinger` (显示合成服务) - `mmcqd/0` (存储I/O线程) #### 3. **获取完整调用栈** - 触发主动call bug时的线程回溯(如引用2末尾的`dump system_ui all thread bt`) - 使用MTK调试工具解析地址符号: ```bash arm-linux-androideabi-addr2line -e vmlinux c06c8bbc ``` #### 4. **检查监控配置** - 验证`/sys/kernel/hang_detect/`下的参数: ```bash adb shell cat /sys/kernel/hang_detect/* ``` - 关键参数: - `tick_threshold`:进程无响应阈值 - `monitored_pids`:被监控进程列表 - `dump_stack`:触发时是否保存堆栈 #### 5. **复现与日志收集** - 开启完整内核日志: ```bash adb shell "echo 8 > /proc/sys/kernel/printk" ``` - 使用`systrace`捕获调度延迟: ```bash python systrace.py --time=300 sched irq freq ``` - 结合`ftrace`锁定阻塞函数: ```bash echo function_graph > /sys/kernel/debug/tracing/current_tracer ``` #### 6. **常见问题模式分析** | 模式 | 日志特征 | 可能原因 | |------|----------|----------| | 内核死锁 | `PC is at mutex_lock+0x...` | 资源竞争或中断禁用 | | 进程阻塞 | `[Hang_Detect] system_server not tick` | Binder调用超时 | | 硬件异常 | `pc : [<ffffffc0>]` | 内存损坏或总线错误 | | 调度延迟 | `status 1:10` | CPU负载过高 | ### 引用分析结论 1. 引用1显示`hang_detect_thread`自身卡死在`console_unlock`函数,表明内核日志系统可能发生死锁[^1] 2. 引用2显示`system_ui`进程无响应触发主动重启,需检查UI线程的Binder调用链[^2] ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值