当前位置:网站首页>ANR 原理及实践
ANR 原理及实践
2022-07-07 02:28:00 【Little xian】
Broadcast ANR 设计原理
- 只在有序广播中才会有ANR的监控
- AMS负责分发有序广播,并在分发的时候设置超时监控报警,如果广播接收者在超时时间范围内处理掉消息并和AMS通信取消本次超时监控则不会发生ANR,反之未取消则判定ANR。
- AMS是用过Binder机制和APP进程通信,当接受到广播数据,会封装数据再sendMessage到主线程消息队列,主线程处理Msg,最终调用receiver.onReceive方法。(当主线程消息队列前面有耗时任务,或者其他进程有耗时任务,影响了当前事件的调度,而不是本身事件耗时过长,也会引发ANR)
Service ANR 设计原理
Input ANR 设计原理
ANR Dump流程
- 过滤掉特殊场景(正在dump,正在关机,正在crash,正在被系统kill)
- 查找需要Dump的进程,主要包括ANR进程的父进程,SystemServer进程,高CPU的(最多5个)进程
- 发送SIGQUIT信号给需要Dump的进程
- 各进程SignalCatcher线程收集当前虚拟机信息,内存信息,class信息,GC信息,再挂起所有线程,获取线程的堆栈信息
- 最后通过管道发送给SystemServer,追加写入到Trace文件中
应用检测ANR
- watchdog
- 监听SIGNALQUIT信号,确定自己进程ANR时候,Java端获取堆栈信息,或者反射调用虚拟机内部Dump线程的堆栈接口,获取数据输出到自己的目录下。
实现参考Xcrash:https://github.com/iqiyi/xCrash/blob/master/README.zh-CN.md
获取ANR Info
- 通过ActivityManagerService.getProcessesInErrorState,遍历mLruProcesses,并根据进程目前的异常状态如crash或者anr类型,返回具体的ProcessErrorStateInfo
ANR出现前消息队列中耗时情况
- 当前 Trace 堆栈所在业务耗时严重;
- 当前 Trace 堆栈所在业务耗时并不严重,但是历史调度有一个严重耗时;
- 当前 Trace 堆栈所在业务耗时并不严重,但是历史调度有多个消息耗时;
- 当前 Trace 堆栈所在业务耗时并不严重,但是历史调度存在巨量重复消息(业务频繁发送消息);
- 当前 Trace 堆栈业务逻辑并不耗时,但是其他线程存在严重资源抢占,如 IO,Mem,CPU;
- 当前 Trace 堆栈业务逻辑并不耗时,但是其他进程存在严重资源抢占,如 IO,Mem,CPU;
ANR日志语义分析
Load: 2.62 / 2.55 / 2.25
表示:1、5、15 分钟内正在使用和等待使用CPU 的活动进程的平均数CPU usage from 0ms to 1987ms later (2020-03-10 08:31:55.169 to 2020-03-10 08:32:17.156)
表明:负载信息抓取在ANR发生之后的0~1987ms。同时也指明了ANR的时间点:2020-03-10 08:31:55.169
如果是 CPU usage xxx awake 表示是ANR之前的系统负载信息41% 2080/system_server: 28% user + 12% kernel / faults: 76445 minor 180 major 26% 9378/com.xiaomi.store: 20% user + 6.8% kernel / faults: 68408 minor 68 major
表示:各个进程占用的CPU的详细情况66% TOTAL: 20% user + 15% kernel + 28% iowait + 0.7% irq + 0.7% softirq
表示:各进程合计占用CPU的信息
ANR 关键字
a. user:用户态,kernel:内核态
b. faults:内存缺页,minor——轻微的,major——重度,需要从磁盘拿数据
c. iowait:IO使用(等待)占比
d. irq:硬中断,softirq:软中断
e. utm: user space time,stm: kernel space time
参考:
边栏推荐
- BindingException 异常(报错)处理
- uniapp开发小程序如何使用微信云托管或云函数进行云开发
- Basic DOS commands
- UIC (configuration UI Engineering) public file library adds 7 industry materials
- JVM 全面深入
- Etcd database source code analysis -- starting from the start function of raftnode
- 地质学类比较有名的外文期刊有哪些?
- Programmers' daily | daily anecdotes
- [GNN] graphic gnn:a gender Introduction (including video)
- 途家、木鸟、美团……民宿暑期战事将起
猜你喜欢
Overview of FlexRay communication protocol
String (explanation)
地质学类比较有名的外文期刊有哪些?
哈趣投影黑馬之姿,僅用半年强勢突圍千元投影儀市場!
Can't you really do it when you are 35 years old?
Unable to debug screen program with serial port
What books can greatly improve programming ideas and abilities?
How to use wechat cloud hosting or cloud functions for cloud development of unapp development applet
ESXI挂载移动(机械)硬盘详细教程
2022 Android interview essential knowledge points, a comprehensive summary
随机推荐
[start from scratch] detailed process of deploying yolov5 in win10 system (CPU, no GPU)
C interview 24 (pointer) define a double array with 20 elements a
JESD204B时钟网络
线性代数(一)
ESXI挂载移动(机械)硬盘详细教程
哈趣投影黑馬之姿,僅用半年强勢突圍千元投影儀市場!
Audio distortion analysis of DSP and DAC based on adau1452
Kotlin之 Databinding 异常
How to solve sqlstate[hy000]: General error: 1364 field 'xxxxx' doesn't have a default value error
How can I check the DOI number of a foreign document?
Go straight to the 2022ecdc fluorite cloud Developer Conference: work with thousands of industries to accelerate intelligent upgrading
企业如何进行数据治理?分享数据治理4个方面的经验总结
FPGA课程:JESD204B的应用场景(干货分享)
Linear algebra (1)
使用net core优势/为什么使用
Abnova 免疫组化服务解决方案
Etcd database source code analysis -- starting from the start function of raftnode
途家、木鸟、美团……民宿暑期战事将起
String (explanation)
Pinduoduo lost the lawsuit: "bargain for free" infringed the right to know but did not constitute fraud, and was sentenced to pay 400 yuan