systemserver为啥很少同步跨进程调用app/DeadSystemException相关问题分析套路

监控android binder size 我们知道binder是android中跨进程通信的一大亮点,但binder通信时如果待传数据较大,可能会出现binder call失败,那怎么才能监控传输多大的size呢。 frameworks/base/core/java/android/os/Binder.java#661 687    private boolean execTransact(int code, long dataObj... 阅读详情
AI摘要

文章讲述了在monkey测试过程中遇到的DeadSystemException,系统崩溃后需要通过分析日志追踪到rootcause。焦点在于systemserver发起的同步跨进程调用导致阻塞,需进一步调查binder和app进程行为以确定问题根源。

背景:

有学员分享了一个问题,说monkey测试过程中有一系列问题属于同类的,具体看如下截图:
在这里插入图片描述
可以看到这里的有很多应用都进行了crash,而且crash原因居然都是写着
DeadSystemException: The system died; earlier logs will point to the root cause

即系统死了这种异常,但是提示也说明需要看更早的日志才可以找到根本原因,即注意这里说的DeadSystemException一般都是需要往前面分析日志找到根本原因

初步分析

一般DeadSystemException: The system died; earlier logs will point to the root cause
打印这类异常时候需要继续往前看日志,看看systemserver到底发生了什么。
往上看日志可以发现如下:

03-29 13:55:30.675   510   535 W Watchdog: *** WATCHDOG KILLING SYSTEM PROCESS: Blocked in monitor com.android.server.wm.WindowManagerService on foreground thread (android.fg)
03-29 13:55:30.676   510   535 W Watchdog: android.fg annotated stack trace:
03-29 13:55:30.676   510   535 W Watchdog:     at com.android.server.wm.WindowManagerService.monitor(WindowManagerService.java:6396)
03-29 13:55:30.677   510   535 W Watchdog:     - waiting to lock <0x048421d2> (a com.android.server.wm.WindowManagerGlobalLock)
03-29 13:55:30.677   510   535 W Watchdog:     at com.android.server.Watchdog$HandlerChecker.run(Watchdog.java:233)
03-29 13:55:30.678   510   535 W Watchdog:     at android.os.Handler.handleCallback(Handler.java:883)
03-29 13:55:30.678   510   535 W Watchdog:     at android.os.Handler.dispatchMessage(Handler.java:100)
03-29 13:55:30.678   510   535 W Watchdog:     at android.os.Looper.loop(Looper.java:214)
03-29 13:55:30.678   510   535 W Watchdog:     at android.os.HandlerThread.run(HandlerThread.java:67)
03-29 13:55:30.678   510   535 W Watchdog:     at com.android.server.ServiceThread.run(ServiceThread.java:44)
03-29 13:55:30.678   510   535 W Watchdog: *** GOODBYE!

明显可以看到确实这个时候系统都触发了watchdog,kill了system process,那么原因还是
waiting to lock <0x048421d2> (a com.android.server.wm.WindowManagerGlobalLock)
即在等待这把锁
这里再往上看可以看到有一个系统anr打印
03-29 13:52:19.196 510 535 I ActivityManager: Dumping to /data/anr/anr_2024-03-29-13-52-19-196

可以看看这个anr的dump日志

注意从上面可以看出watchdog信息可以看出是WindowManagerService的全局锁一直是获取不到,说明有地方长期占用了WindowManagerGlobalLock这个锁,可以在dump中搜一下Blocked关键字,结果如下:
在这里插入图片描述
点开一个查看详情

在这里插入图片描述

可以看到都是在等待同一个锁
lock <0x048421d2> (a com.android.server.wm.WindowManagerGlobalLock)

那么这个锁是被谁持有着不释放呢?
继续查看,查看方法可以搜thread 236,或者是搜索锁对象地址 0x048421d2
在这里插入图片描述

所以这个tid 236线程就是持有锁导致其他线程无法获取锁的根本
但是从堆栈来看看,明显这个是一个跨进程调用startActivity,systemserver在这个binder线程中居然还发起了同步的跨进程调用,即activityStarting,这个调用居然systemserver还是bp的角色。
android.app.IActivityControllerStubStubStubProxy.activityStarting(IActivityController.java:273)

这里就奇怪了,systemserver一般自己作为bp时候的跨进程调用那都是oneway的异步调用,怎么会出现还有同步调用的情况,去aidl确认一下:

在这里插入图片描述
可以看到确实是没有oneway字样,正常其他跨进程调用都是有oneway的,比如如下IApplicationThread接口:
在这里插入图片描述

不过这个IActivityController接口正常情况都是无法使用的

/**
 * Testing interface to monitor what is happening in the activity manager
 * while tests are running.  Not for normal application development.
 * {@hide}
 */
interface IActivityController

可以看到只用于测试哈情况,其实这份日志本身是基于monkey测试的

总结直接问题点:
基于上面分析那就基本上明白了导致系统死锁的直接原因,那就是因为systemserver发起了个同步的跨进程调用,这个跨进程调用半天没有得到对方回应,导致systemserver一直卡在这个同步调用这里。

问题继续展望

上面虽然分析出来了一个直接原因,但是也没有找到根本原因,上面说的systemserver跨进程半天没有得到app层面回应,导致一直卡住,那么为啥会被一直卡住?正常跨进程调用应该很快才对,怎么能一直卡住呢?当前binder到底发生了什么呢?

需要进一步追踪根本原因,目前的日志和材料已经不够了,需要更多的日志,比如kernel日志,binder相关调用日志确认出到底是卡在了 app进程,它一直业务繁忙没处理完这个binder调用,还是说binder调用就是没到app进程等,最好还需要有app进程执行的一个线程情况和所有线程在出现问题时候执行的堆栈。

当然也不追查根本原因也可以有对应的规避方案:

可以考虑这个跨进程调用可能会存在长耗时,可以考虑改善这个跨进程调用为不获取锁等情况,修改可能较大,但是影响小一点,只会影响monkey进程业务

更多framework实战干货,请关注下面“千里马学框架”

杰理芯片外挂Flash音乐播放功能避坑指南(附FAT文件系统配置) 本文详细解析了杰理芯片外挂Flash实现音乐播放功能的技术要点与常见问题,包括硬件连接、SPI驱动配置、FAT文件系统烧录及音乐播放集成等关键环节。特别针对Flash选型、FAT文件系统配置等易错点提供实用解决方案,帮助开发者高效完成嵌入式音频系统开发。 阅读详情

相关推荐

MYSQL、ORACLE、PostgreSQL数据库对象层次及权限管理对比

本文为出于自己扩展、比较、图形化的思维路径自行总结归纳,可能有些细节不太准确,欢迎指正。MySQL、Oracle、PostgreSQL关系型数据库都有管理员用户、用户、权限管理、表函数索引等数据库对象,schema。但在数据库对象隶属层次上有差异和相同的地方。

rachel_2016的博客 1490

展锐平台NewGallery2内存泄露分析

就要往内存泄露的方向去考虑了,一次小的binder传输可能不会有啥问题,但是如果内存泄露积累多了,是不是就会导致 JavaBinder:!,那么就要在binder失败入手,考虑到此问题是长时间运行后必现的问题,那么。通过上面我们的猜想与内存泄露有关加上与binder有关,并且通过查看MediaPlayer的代码可以发现setDataSource的时候确实去跟服务端进行了通讯,这就更一步印证了它的。需要被释放的对象被一些常驻内存的对象持有那么就会出现泄露的情况存在,进而导致我们程序的异常,内存的浪费。...

superjaingchao的专栏 1481

xhs私信协议分析

之前分析过xhs的shield算法,今天再聊聊xhs的私信,文章仅供学习参考研究交流,如有侵权请联系删帖。经过抓包分析发现私信接口并不是走的http协议,而是socket协议。而要获取socket包则需要使用wireshark软件1、protobuf的包体中的序号7,多次验证后发现文字信息的需要需要固定成12、protobuf的包体中的序号12,多次验证后发现文字信息的需要需要固定成1后续有时间的话,再研究一下视频和图片格式的私信协议,这次就分析到这里吧。

佛系更新... 3489

Android System crash DeadSystemException(Service/Activity/终极解决方案)

当Android系统服务已经死亡,app进程与之通讯,会抛出DeadSystemException。可能发生在Activity的生命周期,service的生命周期,其他涉及跨进程通讯,处理起来各有不同

HeXinGen的博客 1万+

logisim实验六:MIPS运算器设计

实验目的 学生理解算术逻辑运算单元(ALU)的基本构成,掌握 Logisim 中各种运算组件的使用方法,熟悉多路选择器的使用,能利用前述实验完成的 32 位加法器、 Logisim 中的运算组件构造指定规格的 ALU 单元。 设计要求 利用前面实验封装好的 32 位加法器以及 logisim 平台中现有运算部件构建一个 32 位算术逻辑运算单元(禁用 Logisim 系统自带的加法器,减法器),可支持算术加、减、乘、除,逻辑与、或、非、异或运算、逻辑左移、逻辑右移、算术右移运算,支持常用程序状态标志(有符号

gyp0205的博客 2万+

ThinkBook 16 2024 Ubuntu驱动全攻略:从无线网卡到触控板

本文详细介绍了ThinkBook 16 2024在Ubuntu系统下的驱动问题解决方案,涵盖无线网卡、蓝牙、显卡和触控板等关键硬件的驱动修复步骤。通过具体命令和配置指南,帮助用户快速解决兼容性问题,提升Ubuntu在ThinkBook上的使用体验。

weixin_29200741的博客 830

Android系统问题及日志分析

android 系统问题及日志分析

QG 6713

95.qt qml-诺谦通用可扩展多功能QML界面

如下图所示:自带一个功能界面,可以通过功能界面添加不同功能,并且可以固定到顶部水平导航栏中,对于N多小功能的项目而言,非常方便,这样用户就可以根据自己喜好来使用自己常用的功能了。

抵抗时间扭曲,坚持做一件有意义的事 3050

[Android][FWK]一个system_server 重启的案例分析

android 8.1 上,报了一个手机重启。 查看android  event log, 查询关键字 am_crash, 发现问题出现的时间点上有个 NullPointerException 16:16:12.278 1000  3277  3456 I am_crash: [3277,0,system_server,-1,java.lang.NullPointerException,Att...

champwang 6116

基于自抗扰控制的虚拟同步发电机二次调频控制研究

摘要:本文针对高比例可再生能源并网导致的电力系统频率稳定性问题,提出基于自抗扰控制(ADRC)的虚拟同步发电机(VSG)二次调频控制策略。通过分析VSG工作原理和传统调频方法的不足,设计了非线性ADRC和线性ADRC两种控制器,详细阐述了参数整定方法。仿真结果表明,该策略能有效消除频率稳态偏差,提升系统抗扰能力,为分布式电源参与电网调频提供了新思路。 关键词:虚拟同步发电机;自抗扰控制;二次调频;频率调节;抗扰能力

huanghm88的专栏 244

SAP ABAP CDS View 里的日期函数

摘要:本文系统介绍了ABAP CDS日期函数在企业级应用中的关键作用,包括账龄计算、合同续期等业务场景。重点解析了DATS_IS_VALID、DATS_DAYS_BETWEEN等核心函数的语义和使用边界,特别强调on_error四种异常处理策略的选择逻辑。针对系统日期获取,对比了经典CDS的参数注入和View Entity会话变量两种方式。文章还提供了完整可运行的示例代码(包含CDS视图和ABAP程序),帮助开发者快速验证不同版本下的函数行为差异,确保在实际项目中正确应用这些日期处理函数。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 382

系统卡死问题分析

问题背景: 测试对平板 系统进行monkey压测时,出现了应用界面卡死的情况。 测试脚本:monkey --ignore-crashes --ignore-timeouts --kill-process-after-error --ignore-security-exceptions --throttle 200 -v -v -v -s 5 10000000 1>>/sdcard/log.log 2>>/sdcard/log_err.log 一边测试一边抓取logcat并.

b178903294的博客 5789

Python爬虫实战:使用最新技术抓取采购网招标公告信息

本文将详细介绍如何使用Python最新爬虫技术构建一个高效的采购网招标公告信息抓取系统。我们将从爬虫基础概念讲起,逐步深入到高级技巧,包括异步处理、反爬虫对策、数据解析与存储等,并提供完整的代码实现。本文旨在为读者提供一套完整的网络数据采集解决方案,适用于各类政府采购平台和商业招标网站。网络爬虫(Web Crawler)是一种自动抓取互联网信息的程序或脚本,它们按照一定的规则,自动地浏览万维网并提取所需数据。在现代商业环境中,爬虫技术广泛应用于价格监控、竞争情报收集、市场研究等领域。

2201_76125261的博客 1623

android+os+stack,Android android.os.DeadSystemException解决方案

Android DeadSystemException 出现情况是被系统杀掉服务导致出现的原因,一般出现在后台用户无感知。1.出错堆栈:image.png2.源码分析private void handleServiceArgs(ServiceArgsData data) {Service s = mServices.get(data.token);if (s != null) {try {if (...

weixin_39898248的博客 2203

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Android System crash DeadSystemException

原因: 遇到的具体情况:

xiaowang_lj的博客 1106

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Android应用停止运行处理策略(如 DeadSystemException)

Android应用停止运行处理策略- https://www.jianshu.com/p/c3da4681a19b Android DeadSystemException- https://stackoverflow.com/questions/42784731/android-deadsystemexception Android DeadSystemException- https://www...

ShareUs的专栏 3万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Android10 设备死机的问题分析和解决

A10 设备死机的分析和解决

1791

android 没有驱动程序,Android模拟器-无法加载驱动程序

在Ubuntu上运行,出现此错误:Cannot launch AVD in emulator.Output:libGL error: unable to load driver: i965_dri.solibGL error: driver pointer missinglibGL error: failed to load driver: i965libGL error: unable to l...

weixin_39653361的博客 338

修改MODEL,BRAND编译不开机

前提:新项目 如果修改 SAGEREAL_MODEL_NAME = UNONU%space%X4G SAGEREAL_BRAND_NAME = UNONU 编译之后出现无法开机,并且出现以下异常,就说明是tee的问题。 解决方法:就是更新瓶钵tee证书,上传,然后再去修改,就不会出现问题。 报错信息: 01-04 00:07:39.602 1180 1180 E AndroidRuntime:...

MYY的博客 712

android.os.DeadSystemException

在程序压测的过程中,出现过此类问题,查了很多资料。都在说是这个问题是系统核心进程出错了,需要重启,所以杀掉了所有的应用。 下面是源代码,源代码,也无法给我们任何的帮助。 /** * The core Android system has died and is going through a runtime restart. All * running apps will be promptly killed. */ public class DeadSystemException extends D

yangyulong0622的博客 6749

android exception异常代码,Android DeadSystemException

目前,我们的HockeyApp崩溃报告中出现了DeadSystemException。 它发生在Android 7.0和Android 7.1上。 我们在应用程序的先前版本中没有遇到此异常(当前它们都已被用户使用),因此我想这个异常是由一些代码更改引起的。 但是堆栈跟踪对此并没有帮助。 任何想法?感谢您的任何建议。HockeyApp的堆栈跟踪:java.lang.RuntimeException:...

weixin_35410816的博客 4783

Android LOG系统原理剖析

在我们android的开发过程中,最不可少的就是加Log,打印Log的操作。 这样可以帮助我们去查看各个变量,理清楚代码的逻辑。 而Android系统,提供了不同维度,不同层面,不同模块的Log的支持。 本文,将会分析Android Log系统的实现。

猿氏悟语 3128

文件句柄耗光造成系统重启BUG排查

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33845477的博客 3872
上一篇: Ubuntu 20.04上Android NDK编译FFmpeg 5.1全程笔记
下一篇: android.anim和android.anim.lf两个线程解析
千里马学框架
博客等级 码龄6年 1万+粉丝 651原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值