kernel空指针引起的system_server watchdog问题分析

本文分析了手机kernel启动时因空指针导致的system_server watchdog问题。问题源于surfaceflinger主线程等待中断处理函数,但该函数因空指针未执行完毕,进而阻塞了system_server。通过分析system_server和surfaceflinger的trace,发现kernel中synaptics_rmi4_add_and_update_tp_data方法和kthread_data方法出现了空指针错误。深入研究发现,中断处理函数引发的空指针异常使进程陷入D状态,修复这个问题的关键在于解决最初的kernel空指针异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. 问题描述

1.1 现象

  手机kernel启动时狂点屏幕会导致手机卡死重启.

1.3 结论

  因为surfaceflinger主线程在等中断处理函数执行执行结束,而中断处理函数一直没有执行完,所以导致surfaceflinger的主线程卡住.这时候system_server通过binder跨进程去调用 surfaceflinger中的方法时,由于surfaceflinger卡住了,所以system_server也会被卡住,最终导致了system_server watchdog.

1.4修复链接:

  XXX


二. 初步分析

2.1 查看system_server trace


  一般对于watchdog问题,我们都会先看看system_server的那一个线程出了问题,出现问题的具体调用栈如下:

从这里我们能看到system_server的binder线程在向surfaceflinger发起跨进程调用时被block了,具体的调用方法是createSurface,那么接下来我们就去看看surfaceflinger的trace,看看它在干什么事情.

2.1 查看surfaceflinger trace

  我下了好几份log,都没有发现watchdog文件中有surfaceflinger的trace,没有能继续往下分析,只能先去找没有打印出surfaceflinger trace的原因.
2.2 surfaceflinger打不出trace的怀疑点
①debuggerd出问题了?
不会出问题,要是它出了问题,其他native进程也不会打印出对应的trace.
②watchdog类里把中surfaceflinger这个要抓trace的进程给去掉了?然后查看了下c8对应的代码:

surfaceflinger这个进程还在默认的列表里面,这就比较奇怪了,然后再继续下载了几十份Log,然而没有一份log有surfaceflinger的trace.
继续看下相应的Log,debuggerd确实打印了相应的log

12-29 20:42:17.814 695 831 W SurfaceFlinger: setTransactionState timed out waiting for previous animation frame
12-29 20:42:19.695 2912 3259 W PushService: 2017-12-29 20:42:19,695 - [WARN::PushService] - [Thread:99] [Slim] Wrote {cmd=SECMSG;chid=5;len=341}
12-29 20:42:19.695 2912 3259 W PushService: 2017-12-29 20:42:19,695 - [WARN::PushService] - [Thread:99] [Slim] 08:42:19 ä¸å Sent Blob [SECMSG,5,5QbAV-13]
12-29 20:42:19.695 933 5418 I ExtendedUtils: printFileName fd(15) -> /system/media/audio/notifications/CrystalRing.ogg
12-29 20:42:19.695 2912 3259 W PushService: 2017-12-29 20:42:19,695 - [WARN::PushService] - [Thread:99] try send mi push message. packagename:com.miui.powerkeeper action:Notification
12-29 20:42:19.696 2912 3259 W PushService: 2017-12-29 20:42:19,695 - [WARN::PushService] - [Thread:99] [Slim] Wrote {cmd=SECMSG;chid=5;len=349}
12-29 20:42:22.955 695 831 W SurfaceFlinger: setTransactionState timed out waiting for previous animation frame
12-29 20:43:16.835 591 591 W : debuggerd: handling request: pid=695 uid=1000 gid=1003 tid=695
12-29 20:43:26.849 591 591 W : debuggerd: resuming target 695
12-29 20:43:26.854 591 591 W : debuggerd: handling request: pid=923 uid=1041 gid=1005 tid=923
12-29 20:43:26.857 590 590 W : debuggerd: handling request: pid=923 uid=1041 gid=1005 tid=923
12-29 20:43:26.999 591 591 W : debuggerd: handling request: pid=924 uid=1047 gid=1005 tid=924
12-29 20:43:27.000 590 590 W : debuggerd: handling request: pid=924 uid=1047 gid=1005 tid=924
12-29 20:43:27.106 591 591 W : debuggerd: handling request: pid=925 uid=1019 gid=1019 tid=925
12-29 20:43:27.107 590 590 W : debuggerd: handling request: pid=925 uid=1019 gid=1019 tid=925
12-29 20:43:27.120 591 591 W : debuggerd: handling request: pid=926 uid=0 gid=0 tid=926
12-29 20:43:57.857 5557 5557 W : debuggerd: handling request: pid=695 uid=1000 gid=1003 tid=695
12-29 20:44:07.870 5557 5557 W : debuggerd: resuming target 695
12-29 20:44:07.876 5557 5557 W : debuggerd: handling request: pid=923 uid=1041 gid=1005 tid=923
12-29 20:44:07.878 590 590 W : debuggerd: handling request: pid=923 uid=1041 gid=1005 tid=923
12-29 20:44:07.931 5557 5557 W : debuggerd: handling request: pid=924 uid=1047 gid=1005 tid=924
12-29 20:44:07.932 590 590 W : debuggerd: handling request: pid=924 uid=1047 gid=1005 tid=924
12-29 20:44:08.044 5557 5557 W : debuggerd: handling request: pid=925 uid=1019 gid=1019 tid=925
12-29 20:44:08.045 590 590 W : debuggerd: handling request: pid=925 uid=1019 gid=1019 tid=925
12-29 20:44:08.056 5557 5557 W : debuggerd: handling request: pid=926 uid=0 gid=0 tid=926


③surfaceflinger进程中的莫个线程D状态了.
由于没有现场,无法确认.

由于第一,第二种都被排除了,只有第三种最可疑了,如果是第三种情况的话,那就肯定是bsp同事合入的代码有问题导致的.

2.3 排查当时合入的代码

  由于没有surfaceflinger的trace,暂时无法继续往下分析了.只能去排查当时进了哪些代码,并且让测试帮忙跑稳定性测试,看看能不能复现.然后排查了一波代码,发现几个改动比较大的,发了邮件让相关的owner自己检查一下,具体的change如下:

<think>好的,我现在需要帮助用户解决关于system_server线程的问题,特别是thread-8的技术问题和日志分析定位。首先,我需要回忆一下system_server的作用和相关知识。system_serverAndroid系统中的一个核心进程,负责启动和管理各种系统服务,比如ActivityManagerService、WindowManagerService等。如果其中的某个线程出现问题,比如thread-8出现异常,可能会导致系统卡顿甚至崩溃。 用户提到了日志分析和定位,所以我应该考虑如何从日志入手。首先,常见的日志来源有logcat、traces.txt以及crash日志。用户提供的引用中提到了system_server_crash和WatchDog日志,这些都可能包含关键信息。例如,引用[2]提到Android 9系统卡死后查看system_server_crash日志,而引用[3]则提到WatchDog生成的traces文件。这些文件记录了线程堆栈信息,有助于定位问题。 接下来,我需要分析具体步骤。第一步是收集相关日志,包括logcat中的崩溃信息、traces文件和可能的ANR日志。然后,在日志中搜索“system_server”和“thread-8”的关键词,找到对应的错误堆栈。例如,在traces文件中可以查看thread-8的调用栈,确定其执行的任务。引用[3]中的traces文件就是由WatchDog生成的,可能包含死锁或长时间阻塞的信息。 然后,需要检查线程状态。如果thread-8处于BLOCKED或WAITING状态,可能涉及锁竞争或资源死锁。此外,还要看是否有异常抛出,比如NullPointerException,这可能在logcat中有记录。引用[4]提到了GC日志中的时间分析,虽然不直接相关,但系统服务的性能问题也可能与GC有关,需要综合考虑。 可能的原因包括死锁、某个系统服务处理超时、或资源泄漏。例如,如果thread-8负责处理Binder通信,长时间阻塞可能导致WatchDog触发,如引用[3]中的情况。或者,如引用[1]所述,system_server在启动时fork出现问题,但用户的问题更侧重于运行时的线程问题。 最后,解决方案部分需要指导用户如何定位具体原因,比如分析堆栈、检查锁竞争、使用调试工具等。同时,生成的相关问题应涵盖日志分析WatchDog机制、线程优化和常见崩溃场景,帮助用户进一步学习。 需要确保回答符合用户的要求,使用中文,正确应用引用标记,并生成相关问题。同时,注意LaTeX格式的正确使用,尽管在技术问题中可能较少涉及数学公式,但如果有变量或代码,需正确格式化。</think>### system_server线程相关问题分析与定位步骤 #### 1. 日志收集与初步筛选 - **关键日志来源**: - **logcat崩溃日志**:搜索`system_server`进程的崩溃记录,例如`FATAL EXCEPTION`或`ANR`信息[^2]。 - **traces.txt文件**:位于`/data/anr/`目录,记录线程堆栈信息,如`traces_SystemServer_*.txt`[^3]。 - **WatchDog日志**:当系统检测到服务阻塞时,会生成包含线程状态的文件[^3]。 示例日志片段: ``` "system_server" prio=5 tid=8 Native | group="main" sCount=1 dsCount=0 flags=1 obj=0x12c00000 self=0x7f8a3c0000 | sysTid=2197 nice=-2 cgrp=default sched=0/0 handle=0x7f8e4cb4a0 | state=S schedstat=( 12345678 9876543 123 ) utm=12 stm=5 core=1 HZ=100 ``` #### 2. 定位thread-8的具体任务 - **查看线程名称与堆栈**: - 通过`traces.txt`确认`thread-8`所属的系统服务(如`ActivityManager`、`WindowManager`等)。 - 示例堆栈分析: ```python # traces.txt片段 "thread-8" daemon prio=5 tid=8 Blocked at com.android.server.am.ActivityManagerService.someMethod(...) - waiting to lock <0x12345678> (a java.lang.Object) ``` 此处显示线程因锁竞争被阻塞[^3]。 #### 3. 常见问题场景与分析方法 - **死锁/锁竞争**: - 检查线程是否在`waiting to lock`某资源,且该资源被其他线程占用。 - 使用`jstack`或`kill -3`主动生成堆栈快照。 - **系统服务超时**: - 若涉及`WatchDog`日志,检查是否有服务未按时响应心跳(默认超时1分钟)。 - **CPU/内存资源耗尽**: - 结合`user/sys/real`时间分析(参考GC日志分析方法[^4]),确认是否因高负载导致线程阻塞。 #### 4. 解决方案与工具 - **锁竞争优化**: - 使用`synchronized`替换为`ReentrantLock`并设置超时。 - 通过`StrictMode`检测主线程耗时操作。 - **WatchDog机制规避**: ```java // 在服务中定期喂狗 Watchdog.getInstance().poke(); ``` - **性能分析工具**: - **systrace**:分析线程调度与CPU占用。 - **Android Profiler**:监控内存泄漏与线程状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值