MTK system_server 卡死导致手机重启案例分析

05d4a90957f99f8afe6328405867a439.gif

和你一起终身学习,这里是程序员Android

经典好文推荐,通过阅读本文,您将收获以下知识点:

一、MTK AEE Log分析工具
二、AEE Log分析流程
三、system_server 卡死案例分析及解决

本文主要针对 Exception Type: system_server_watchdog , system_server卡死找出的分析以及解决方案。

一、MTK AEE Log分析工具

MTK AEE Log 获取方式:

程序员Android
回复 aee 即可获取解析重启db log的工具。

二、AEE Log分析流程

1. 使用AEE 工具解析 dbg 文件。

3c97631ef0c1e3120b01b15bb1d983d4.jpeg

使用解析db.fatal.02.SWT.dbg

059278b2f9d936e2bc90298da034bdc8.jpeg

AEE Log 解析出来的文件

2.分析解析出来的exp_main等文件

exp_main 文件会记录发生重启时候的 log 打印信息。

部分重启异常 Log信息如下:

$** *** *** *** *** *** *** *** Fatal *** *** *** *** *** *** *** **$
Build Info: 'alps-mp-o1.mp7:alps-mp-o1.mp7:mt6765:S01,ACE/AS0618/AS0618:8.1.0/O11019/1548123508:user/release-keys'
Flavor Info: 'None'
Exception Log Time:[Thu Mar 14 14:00:03 CST 2019] [38684.729626]Exception Class: SWT
Exception Type: system_server_watchdogCurrent Executing Process: 
system_serverTrigger time:[2019-03-14 14:00:03.711844] pid:1029Backtrace: 
Process: system_server
Subject: Blocked in handler on ActivityManager (ActivityManager)
Build: ACE/AS0618/AS0618:8.1.0/O11019/1548123508:user/release-keys

3.exp_main 文件解析

从开头的Log总体信息概览,我们可以看到 发生重启的时间类型触发重启的进程以及PID系统Blocked 的地方

结合exp_main以及 trace分析重启 Log
Log分析如下:

// 1.重启触发时间,以及PID 
Trigger time:[2019-03-14 14:00:03.711844] pid:1029
// 2.Blocked 的进程
Backtrace: 
Process: system_server
Subject: Blocked in handler on ActivityManager (ActivityManager)
// 3.根据PID 查看Trace信息
----- pid 1029 at 2019-03-14 13:59:58 -----
Cmd line: system_server... ...
// 4.根据Backtrace 查看Blocked的信息
"ActivityManager" prio=5 tid=11 Blocked... ...
// 5.tid=11 等待 tid=106的线程释放资源锁- waiting to lock <0x090691f3> (a android.util.ArrayMap) held by thread 106  
... ...// 6.查看tid = 106 持锁情况
"backup" prio=5 tid=106 Waiting
... ... at java.lang.Object.wait(Native method)- waiting on <0x06a44c62> (a com.android.server.am.ContentProviderRecord)
// 7.死锁卡住的地方at com.android.server.am.ActivityManagerService.getContentProviderImpl(ActivityManagerService.java:12127)- locked <0x06a44c62> (a com.android.server.am.ContentProviderRecord)...  ..."Binder:1029_8" prio=5 tid=107 Blocked
// 8.log中  tid=107 被 106 Blocked 进一步问题的加重at com.android.server.notification.RankingHelper.getRecord(RankingHelper.java:258)- waiting to lock <0x090691f3> (a android.util.ArrayMap) held by thread 106$** *** *** *** *** *** *** *** Fatal *** *** *** *** *** *** *** **$

6ff7d66b8c8ab5044555ace387ae42a7.jpeg

Log 分析大致过程截图

完整 log 请在公众号上获取

三、system_server 卡死案例分析及解决

通过 Log 找到卡死原因后,解决此问题。
需要修改ActivityManagerService类。

1.修改代码路径如下:alps/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

2.解决思路

避免 provider 长时间持锁触发MTK 60s 的SWT 重启机制,设置超时时间,超过时间就要释放资源锁,避免发生此问题。

3.diff 修改方案如下:

--- a/[alps/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java;h=d5e2e1411f3698a829e997d402c7482ec277fa8c;hb=d5e2e1411f3698a829e997d402c7482ec277fa8c)+++ b/[alps/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java;h=03208f78a2bf3167b4f0790019326e3939cc5444;hb=03208f78a2bf3167b4f0790019326e3939cc5444)@@ [-545,7](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java;h=d5e2e1411f3698a829e997d402c7482ec277fa8c;hb=d5e2e1411f3698a829e997d402c7482ec277fa8c#l545) [+545,9](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java;h=03208f78a2bf3167b4f0790019326e3939cc5444;hb=03208f78a2bf3167b4f0790019326e3939cc5444#l545) @@ public class ActivityManagerService extends IActivityManager.Stub// How long we wait for an attached process to publish its content providers// before we decide it must be hung.static final int CONTENT_PROVIDER_PUBLISH_TIMEOUT = 10*1000;-+    // How long we wait for provider to be notify before we decide it may be hung.+    static final int CONTENT_PROVIDER_WAIT_TIMEOUT = 20*1000;+       // How long we wait for a launched process to attach to the activity manager// before we decide it's never going to come up for real, when the process was// started with a wrapper for instrumentation (such as Valgrind) because it@@ [-1745,6](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java;h=d5e2e1411f3698a829e997d402c7482ec277fa8c;hb=d5e2e1411f3698a829e997d402c7482ec277fa8c#l1745) [+1747,7](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java;h=03208f78a2bf3167b4f0790019326e3939cc5444;hb=03208f78a2bf3167b4f0790019326e3939cc5444#l1747) @@ public class ActivityManagerService extends IActivityManager.Stubstatic final int PUSH_TEMP_WHITELIST_UI_MSG = 68;static final int SERVICE_FOREGROUND_CRASH_MSG = 69;static final int DISPATCH_OOM_ADJ_OBSERVER_MSG = 70;+        static final int CONTENT_PROVIDER_WAIT_TIMEOUT_MSG = 71;static final int START_USER_SWITCH_FG_MSG = 712;static final int NOTIFY_VR_KEYGUARD_MSG = 74;@@ [-2108,6](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java;h=d5e2e1411f3698a829e997d402c7482ec277fa8c;hb=d5e2e1411f3698a829e997d402c7482ec277fa8c#l2108) [+2111,12](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java;h=03208f78a2bf3167b4f0790019326e3939cc5444;hb=03208f78a2bf3167b4f0790019326e3939cc5444#l2111) @@ public class ActivityManagerService extends IActivityManager.Stubsynchronized (ActivityManagerService.this) {mActivityStarter.doPendingActivityLaunchesLocked(true);}+            } break;+                       case CONTENT_PROVIDER_WAIT_TIMEOUT_MSG: {+                ContentProviderRecord cpr = (ContentProviderRecord)msg.obj;+                synchronized (ActivityManagerService.this) {+                    processContentProviderWaitTimedOutLocked(cpr);+                }} break;case KILL_APPLICATION_MSG: {synchronized (ActivityManagerService.this) {@@ [-7029,7](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java;h=d5e2e1411f3698a829e997d402c7482ec277fa8c;hb=d5e2e1411f3698a829e997d402c7482ec277fa8c#l7029) [+7038,31](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java;h=03208f78a2bf3167b4f0790019326e3939cc5444;hb=03208f78a2bf3167b4f0790019326e3939cc5444#l7038) @@ public class ActivityManagerService extends IActivityManager.StubcleanupAppInLaunchingProvidersLocked(app, true);removeProcessLocked(app, false, true, "timeout publishing content providers");}+       +    @GuardedBy("this")+    private final void processContentProviderWaitTimedOutLocked(ContentProviderRecord cpr) {+        try {+            if (mLaunchingProviders.contains(cpr)) {+                if (DEBUG_MU) Slog.v(TAG_MU,+                    "Remove from mLaunchingProviders, " + cpr+                    + " launchingApp=" + cpr.launchingApp);+                mLaunchingProviders.remove(cpr);+            }+            if (DEBUG_MU) Slog.v(TAG_MU,+                "RemoveMessages CONTENT_PROVIDER_WAIT_TIMEOUT_MSG, " + cpr+                + " launchingApp=" + cpr.launchingApp);+            mHandler.removeMessages(CONTENT_PROVIDER_WAIT_TIMEOUT_MSG, cpr);+            synchronized (cpr) {+                cpr.notifyAll();+                cpr.launchingApp = null;+            }+        } catch (Exception e) {+            if (DEBUG_MU) Slog.v(TAG_MU,+                "processContentProviderWaitTimedOutLocked exception, " + e);+        }+    }+       private final void processStartTimedOutLocked(ProcessRecord app) {final int pid = app.pid;boolean gone = false;@@ [-12124,11](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java;h=d5e2e1411f3698a829e997d402c7482ec277fa8c;hb=d5e2e1411f3698a829e997d402c7482ec277fa8c#l12124) [+12157,33](http://192.168.11.104/gitweb/?p=alps-mp-o1.mp1-V1.git;a=blob;f=alps/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java;h=03208f78a2bf3167b4f0790019326e3939cc5444;hb=03208f78a2bf3167b4f0790019326e3939cc5444#l12157) @@ public class ActivityManagerService extends IActivityManager.Stubif (conn != null) {conn.waiting = true;}+                                       // add 20s wait timeout,avoid +                    if (!mHandler.hasMessages(CONTENT_PROVIDER_WAIT_TIMEOUT_MSG, cpr)) {+                        if (DEBUG_MU) Slog.v(TAG_MU,+                            "SendMessageDelayed CONTENT_PROVIDER_WAIT_TIMEOUT_MSG, " + cpr+                            + " launchingApp=" + cpr.launchingApp);+                        Message msg = mHandler.obtainMessage(CONTENT_PROVIDER_WAIT_TIMEOUT_MSG);+                        msg.obj = cpr;+                        mHandler.sendMessageDelayed(msg, CONTENT_PROVIDER_WAIT_TIMEOUT);+                    } else {+                        if (DEBUG_MU) Slog.v(TAG_MU,+                            "There is another waiting to start provider " + cpr+                            + " launchingApp=" + cpr.launchingApp+                            + ", not send CONTENT_PROVIDER_WAIT_TIMEOUT_MSG again");+                    }+                                       cpr.wait();} catch (InterruptedException ex) {} finally {if (conn != null) {conn.waiting = false;+                    }+                                       // remove wait time out message+                    if (mHandler.hasMessages(CONTENT_PROVIDER_WAIT_TIMEOUT_MSG, cpr)) {+                        if (DEBUG_MU) Slog.v(TAG_MU,+                            "After wait removeMessages CONTENT_PROVIDER_WAIT_TIMEOUT_MSG, "+                            + cpr + " launchingApp=" + cpr.launchingApp);+                            mHandler.removeMessages(CONTENT_PROVIDER_WAIT_TIMEOUT_MSG, cpr);}}}

参考文献:

【腾讯文档】Android Framework 知识库
https://docs.qq.com/doc/DSXBmSG9VbEROUXF5

友情推荐:

Android 开发干货集锦

至此,本篇已结束。转载网络的文章,小编觉得很优秀,欢迎点击阅读原文,支持原创作者,如有侵权,恳请联系小编删除,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

f80dbf8b93884caa64fac37931f4cf35.jpeg

点击阅读原文,为大佬点赞!

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

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

相关文章

力扣SQL之路:窗口函数应用

文章目录 1.引言2.力扣SQL题目3. 解题策略4.代码实现5.总结 1.引言 窗口函数是 SQL 中一种强大的分析函数&#xff0c;它可以在结果集中创建一个窗口&#xff0c;并对窗口内的数据进行计算和分析。在力扣&#xff08;LeetCode&#xff09;的 SQL 题目中&#xff0c;窗口函数经…

Linux进程概念(一)

文章目录 Linux进程概念查看进程杀死进程进程标识符 手动创建进程的方式fork函数创建进程 进程状态运行态阻塞态和挂起 Linux进程概念 前文我们了解了&#xff0c;进程的基本概念&#xff0c;在课本上被描述为&#xff0c;正在执行的程序&#xff0c;在linux内核上&#xff0c…

如何在 Ubuntu 22.04 下编译 StoneDB for MySQL 8.0 | StoneDB 使用教程 #1

作者&#xff1a;双飞&#xff08;花名&#xff1a;小鱼&#xff09; 杭州电子科技大学在读硕士 StoneDB 内核研发实习生 ❝ 大家好&#xff0c;我是 StoneDB 的实习生小鱼&#xff0c;目前正在做 StoneDB 8.0 内核升级相关的一些事情。刚开始接触数据库开发没多久&#xff0c…

解码“平台工程”,VMware 有备而来

随着全球数字化进程加快&#xff0c;企业使用前沿技术加快商业创新&#xff0c;以提高竞争力。其中如何加快开发效率&#xff0c;为客户创造更多价值成为新的关注焦点。 继DevOps后&#xff0c;“平台工程”&#xff08;Platform Engineering&#xff09; 一词引发热议。平台工…

MyBatis的使用方法

文章目录 一、MyBatis的创建准备工作 二、MyBatis的使用1.项目分层2.业务代码1&#xff09;使用XML的方法2&#xff09;直接使用注解 总结 一、MyBatis的创建 准备工作 1.添加依赖 旧项目 方法一&#xff1a;在pom.xml中添加MyBatis和MySQL Diver依赖 <!-- 添加 MyBati…

信息技术会考操作题excel,信息技术会考操作题目

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;信息技术会考操作题python计算题&#xff0c;信息技术会考操作题没有保存&#xff0c;今天让我们一起来看看吧&#xff01; 1. 数据分析题&#xff08;17分&#xff09;&#xff1a; 流行病学通常关注单日治愈患者例数增…

网络知识介绍

一、TCP 传输控制协议&#xff0c;Transmission Control Protocol。 面向广域网的通信协议&#xff0c;跨域多个网络通信时&#xff0c;为两个通信端点之间提供一条具有如下特点的通信方式&#xff1a; 基于流、面向连接、可靠通信方式、网络状况不佳时尽量降低系统由于重传带…

初识Linux

今天简单了解了关于操作系统的发展史&#xff0c;学习了在Linux中如何远程连接云服务器的指令&#xff0c;以及在Linux中创建多个用户的指令。 1. ssh root 服务器远程地址 作用是用来连接XShell与云服务器&#xff0c;输入该指令后会自动生成输入密码的窗口&#xff0c;如…

【产品经理】高阶产品如何处理需求?(3方法论+2案例+1清单)

不管你是萌新小白&#xff0c;还是工作了几年的“老油条”&#xff0c;需求一直是产品经理工作的重点。只不过&#xff0c;不同年限的产品经理需要面对的需求大有不同&#xff0c;对能力的要求更高。 不知你是否遇过以下问题&#xff1f; 你接手一个项目后&#xff0c;不知从何…

DID以及社交网络中的ZKP

1. 引言 本文关键术语为&#xff1a; Decentralized Identity (DID&#xff0c;去中心化身份) or self-sovereign identity (SSI&#xff0c;自治身份) &#xff1a;是一个基于开放标准的框架&#xff0c;使用自主、独立的标识符和可验证证书&#xff0c;实现可信的数据交换。…

虹科案例|如何分析设备故障时间和次数,打破生产瓶颈?

虹科设备绩效管理系统 保障生产设备的稳定性和可靠性 生产设备的稳定性和可靠性是保证企业正常生产的重要条件之一&#xff0c;设备故障的频发严重影响企业的正常生产&#xff0c;那么如何分析设备故障时间和次数&#xff0c;查找设备故障原因&#xff0c;协助企业打破生产瓶…

树莓派通过天线+gps获取经纬度并调用高德地图api在地图上标点

完整项目为《基于机器视觉的行人和路面缺陷检测及其边缘设备部署》 完整功能视频演示地址&#xff1a;本科最后的课设&#xff1a;“车载系统的辅助系统——基于机器视觉的行人和路面缺陷检测”完结撒花*罒▽罒*_哔哩哔哩_bilibili 该博客介绍的功能为&#xff1a; 1&#xff1…

初步了解c#编程语言--(1)

初识c#编程语言 一、见识c#语言编写的各类应用程序 关于用c#语言编写的各类应用程序有以下几种&#xff1a; 1.Console 在编写Console程序时&#xff0c;要注意创建项目时&#xff0c;是选择控制台应用程序&#xff08;Console Application&#xff09;&#xff0c;在这里…

正泰电力携手图扑:VR 变电站事故追忆反演

VR(Virtual Reality&#xff0c;虚拟现实)技术作为近年来快速发展的一项新技术&#xff0c;具有广泛的应用前景&#xff0c;支持融合人工智能、机器学习、大数据等技术&#xff0c;实现更加智能化、个性化的应用。在电力能源领域&#xff0c;VR 技术在高性能计算机和专有设备支…

qssh使用

到官网下载qssh的源码QSsh-botan-1&#xff0c;使用qtcreator打开后&#xff0c;直接编译&#xff0c;即可得到qssh的库 头文件将QSsh-botan-1\src\libs\ssh目录下的.h文件拷到include文件夹下&#xff0c;即为库头文件。 qssh有个问题&#xff0c;如果你将qssh的类放在子线程…

25.10 matlab里面的10中优化方法介绍—— 函数fmincon(matlab程序)

1.简述 关于非线性规划 非线性规划问题是指目标函数或者约束条件中包含非线性函数的规划问题。 前面我们学到的线性规划更多的是理想状况或者说只有在习题中&#xff0c;为了便于我们理解&#xff0c;引导我们进入规划模型的一种情况。相比之下&#xff0c;非线性规划会更加贴近…

【雕爷学编程】MicroPython动手做(25)——语音合成与语音识别

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

使用ansible playbook编写lnmp架构

使用ansible playbook编写lnmp架构 - name: nginx playgather_facts: falsehosts: lnmpremote_user: roottasks: - name: stop firewalldservice: namefirewalld statestopped- name: syslinuxcommand: /usr/sbin/setenforce 0ignore_errors: true- name: nginx.repocopy: src/…

DLA :pytorch添加算子

pytorch的C extension写法 这部分主要介绍如何在pytorch中添加自定义的算子(例如&#xff0c;您可能希望 使用您在论文中找到的新颖激活函数&#xff0c;或实现操作 您作为研究的一部分进行了开发。)&#xff0c;需要以下cuda基础。就总体的逻辑来说正向传播需要输入数据&#…

Eureka 学习笔记4:EurekaClient

版本 awsVersion ‘1.11.277’ EurekaClient 接口实现了 LookupService 接口&#xff0c;拥有唯一的实现类 DiscoveryClient 类。 LookupService 接口提供以下功能&#xff1a; 获取注册表根据应用名称获取应用根据实例 id 获取实例信息 public interface LookupService<…