ANR系列(三)——ANR分析套路

2023-05-16

前言

在懂得了ANR的发生原理和监控原理之后,是时候针对项目中的ANR进行分析了,在分析前要知道ANR的分析套路一般是怎么分析的

分析ANR问题需要哪些日志

  • Trace日志:当ANR产生的时候,系统会dump此时的top进程中Thread的运行状态,将其保存在trace文件上
  • AnrInfo日志:当ANR产生的时候,logcat会打印出当前AnrInfo信息,该信息可以通过ActivityManagerService.getProcessesInErrorState()方法获取
  • Bugreport日志:当前Android设备上的错误报告,包含设备日志、堆栈轨迹和其他诊断信息,该信息可以通过adb bugreport D:\命令获取

ANR的分析思路

  • 一、看Trace信息
    • 死锁堆栈、业务堆栈、IPC Block堆栈、系统堆栈
  • 二、看关键字
    • Load、CPU、Slow Operation、Kswapd、Mmcqd、Kwork、Lowmemorykiller、onTrimMemory
  • 三、看系统cpu负载分布
    • 通过系统整体CPU负载User、Sys、IOWait占比,判断CPU资源紧张,还是IO资源紧张,进一步分析当前负载过高是发生在应用空间还是系统空间
  • 四、看进程CPU
    • 观察进程CPU占比CPU usage from 37010ms to 0ms ago101% 23326/com.demo: 32% user + 68% kernel
  • 五、看线程CPU:
    • 对比各线程CPU占比,以及线程内部user和kernel占比,可以从目标进程内部分析各个线程的(utm,stm),进一步分析是哪个线程有问题了
  • 六、看消息调度锁定细节
    • 发生ANR时,没有一个消息是无辜的

Trace日志

----- pid 23326 at 2023-02-21 00:15:26 -----
Cmd line: com.demo
Build fingerprint: 'google/android_x86/x86:7.1.2/N2G48C/N975FXXU1ASGO:user/release-keys'
ABI: 'x86'                                 //x86一般为模拟器
Build type: optimized
Zygote loaded classes=4380 post zygote classes=9911
Intern table: 48884 strong; 554 weak
JNI: CheckJNI is off; globals=1079 (plus 1467 weak)
Libraries: ...
Heap: 17% free, 43MB/52MB; 674957 objects  //已分配堆内存大小52MB,其中已用43MB,剩下17%空余,共分配了674957个对象
Total time spent in GC: 6.414s             //GC用过了多少时间
Mean GC size throughput: 244MB/s
Mean GC object throughput: 6.31642e+06 objects/s
Total number of allocations 41189203       //进程创建到现在一共创建了多少对象
Total bytes allocated 1GB                  //进程创建到现在一共申请了1GB内存
Total bytes freed 1GB                      //进程创建到现在一共释放了1GB内存 
Free memory 8MB                            //不扩展堆堆情况下可用的内存
Free memory until GC 8MB                   //GC前的可用内存
Free memory until OOME 212MB               //OOM之前的可用内存,这个值很小,说明内存紧张
Total memory 52MB                          //当前总内存(已用+可用)
Max memory 256MB                           //进程最多能申请的内存
Zygote space size 1552KB
Total mutator paused time: 177.563ms
Total time waiting for GC to complete: 89.366ms
Total GC count: 130                        //GC次数
Total GC time: 6.414s                      //GC时长
Total blocking GC count: 1                 //GC被block次数以及时长
Total blocking GC time: 100.948ms
suspend all histogram:	Sum: 65.115ms 99% C.I. 5.440us-15646.719us Avg: 478.786us Max: 35628us
DALVIK THREADS (65):                       //当前进程共有65个线程

"Signal Catcher" daemon prio=5 tid=3 Runnable
  | group="system" sCount=0 dsCount=0 obj=0x12c3a310 self=0xb6ed7e00
  | sysTid=23332 nice=0 cgrp=default sched=0/0 handle=0xc2ba6910
  | state=R schedstat=( 63328804 15730865 32 ) utm=3 stm=2 core=3 HZ=100
  | stack=0xc2aaa000-0xc2aac000 stackSize=1014KB
  | held mutexes= "mutator lock"(shared held)
  
// Signal Catcher:线程名  daemon: 守护线程  prio:线程优先级  tid:线程内部id  Runnable: 线程状态
// group: 线程所属的线程组  sCount:线程挂起次数  dsCount:用于调试的线程挂起次数  obj:当前线程关联的Java线程对象  self:当前线程地址
// sysTid:线程真正意义上的tid  nice:调度优先级,值越小优先级越高  cgrp: 进程所属的进程调度组  sched: 调度策略  handle:函数处理地址
// state:线程状态  schedstat:CPU调度时间统计,依次表示cpu运行时间、RQ队列等待时间、cpu调度切换次数  utm: 用户态的cpu时间  stm:内核态的cpu时间  core:该线程的最后运行所在核  HZ:时钟频率
// stack:线程栈的地址空间  stackSize:栈的大小
// mutexes:所持有 mutex 类型,有独占锁(exclusive)和 共享锁(shared)两类

AnrInfo日志

ANR in com.demo (com.demo/com.demo.SplashActivity)
PID: 23326
Reason: Input dispatching timed out (Waiting because no window has focus but there is a focused application that may eventually add a window when it finishes starting up.)
//系统负载:表示不同时间段的系统整体负载, 依次表示ANR发生前 1分钟、前5分钟、前15分钟时间段的cpu负载
Load: 8.44 / 8.67 / 8.1
//进程cpu使用率:表示当前ANR发生前的进程cpu使用率
CPU usage from 37010ms to 0ms ago (2023-02-21 00:14:49.456 to 2023-02-21 00:15:26.466):
  101% 23326/com.demo: 32% user + 68% kernel / faults: 257 minor
  0.9% 1298/system_server: 0.5% user + 0.4% kernel / faults: 10086 minor 30 major
  0.1% 1387/com.android.systemui: 0% user + 0% kernel / faults: 3023 minor 4 major
  0.1% 1744/com.android.launcher3: 0% user + 0% kernel / faults: 124 minor 4 major
  0% 1105/surfaceflinger: 0% user + 0% kernel
  0% 1110/audioserver: 0% user + 0% kernel
  0% 7/rcu_sched: 0% user + 0% kernel
  0% 275/kworker/0:1: 0% user + 0% kernel
  0% 1669/android.ext.services: 0% user + 0% kernel / faults: 117 minor 2 major
//系统cpu使用率总汇
25% TOTAL: 8.3% user + 17% kernel + 0% iowait
CPU usage from 1434ms to 1936ms later (2023-02-21 00:15:27.900 to 2023-02-21 00:15:28.402):
  102% 23326/com.demo: 29% user + 73% kernel
    100% 23380/AsyncInit: 27% user + 73% kernel
24% TOTAL: 7% user + 17% kernel
  1. 先分析系统负载Load字段,8.44 / 8.67 / 8.1说明系统当前的负载还算可以
  2. 再从cpu信息找到当前应用cpu使用率高达101%,从下面可以找到当前的线程卡在AsyncInit方法上

Bugreport日志

Bugreport日志比较冗长,包含设备的各种信息,对于ANR来说,我们只要过滤ANR需要的关键字即可

1、搜索am_anr

通过当前关键字可以找到最终发送ANR的罪魁祸首

03-07 22:01:47.632  1000  1675 15617 I am_anr  : [0,6267,com.demo,953695814,executing service com.demo/com.demo.hensen.MyService]

2、搜索ANR in

通过当前关键字可以找到最终发送ANR的罪魁祸首

E ActivityManager: ANR in com.demo.hensen.MyService
E ActivityManager: PID: 3036
E ActivityManager: Reason: executing service com.demo/com.demo.hensen.MyService
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ANR系列(三)——ANR分析套路 的相关文章

  • 【WSL】WSL迁移教程

    写在前面 如果我们是通过Windows Store进行安装的 xff0c 就会默认安装到C盘 在使用过程中 xff0c WSL占用空间会越来越大 xff0c 很容易让C盘爆满 xff0c 所以我们需要将其迁移到其他非C盘的地方 终止正在运行
  • 【WSA】Win11 安卓子系统配置上网方法

    搜索系统环境变量 xff1a 在里面添加ADB的安装路径 xff1a 在终端里输入adb version xff0c 测试adb是否正常工作 xff1a 在终端里输入ipconfig xff0c 查看安卓子系统IP地址 xff1a 在终端输
  • 【WSA】Win11安卓子系统提示VirtWifi的连接受限的解决方法

    问题描述 每次WSA启动时都会有如下提示 xff1a 虽说不影响使用 xff0c 但是看着实在是闹心 解决方案 1 下载ADB工具 xff1a Platform tools下载 Platform tools 安卓调试工具包 官方版下载 系统
  • Centos CA自签证书服务器及自签证书配置手册

    Centos CA自签证书服务器及自签证书配置手册 1 准备工作1 1 系统版本信息1 2 创建必要的目录和文件 2 创建CA2 1 生成CA私钥文件 Key 2 2 生成CA自签名证书2 3 生成自签名证书 拓展部分 2 4 etc pk
  • AttributeError: ‘DataFrame‘ object has no attribute ‘ix‘

    问题原因 pandas版本0 20 0及其以后版本中 xff0c ix已经不被推荐使用 问题解决 使用loc和iloc替换 loc loc gets rows or columns with particular labels from t
  • 使用OLS摘要解释线性回归的结果

    下面是一个回归过程 xff0c 用于拟合收入和教育情况 span class token function import span pandas as pd span class token function import span mat
  • 夏皮罗-威尔克检验(Shapiro–Wilk test)

    1介绍 夏皮罗 威尔克检验是一种在频率上统计检验中检验正态性的方法 它在1965年由夏皮罗和威尔克发表 2 理论 Shapiro Wilk检验检验了样本x 1 xff0c xff0c x n来自正态分布总体的原假设 该检验统计量是 3 解解
  • KS检验

    1 KS 检验 xff08 Kolmogorov Smirnov test xff09 Kolmogorov Smirnov是比较一个频率分布f x 与理论分布g x 或者两个观测值分布的检验方法 其原假设H0 两个数据分布一致或者数据符合
  • git status 命令详解

    git status命令表示 xff1a 文件 xff0c 文件夹在工作区 xff0c 暂存区的状态 xff0c 下图就是文件 xff0c 文件夹三种状态 xff1a Changes to be committed use git rest
  • PyTorch 中的乘法:mul()、multiply()、matmul()、mm()、mv()、dot()

    torch mul 函数功能 xff1a 逐个对 input 和 other 中对应的元素相乘 本操作支持广播 xff0c 因此 input 和 other 均可以是张量或者数字 span class token keyword impor
  • Adblock Plus Rules 自用 2021

    Adblock Plus Rules obsolete ZhihuCSDNBilibiliBaidu 64 64 static zhihu com heifetz lib js 64 64 static zhihu com heifetz
  • pandas函数 apply、iterrows、iteritems、groupyby

    apply DataFrame span class token punctuation span span class token builtin apply span span class token punctuation span
  • PyTorch中 tensor.detach() 和 tensor.data 的区别

    以 a data a detach 为例 xff1a 两种方法均会返回和a相同的tensor xff0c 且与原tensor a 共享数据 xff0c 一方改变 xff0c 则另一方也改变 所起的作用均是将变量tensor从原有的计算图中分
  • 解决Typora的测试版已过期问题 This beta version of Typora is expired, please download and install a newer versio

    错误提示 xff1a The beta version of typora span class token keyword is span expired span class token punctuation span please
  • WSL2 配置SSH 设置开机自启

    WSL2 配置SSH 设置开机自启 WSL2 配置SSH 设置开机自启先说结论完整wsl help WSL2 配置SSH 设置开机自启 尝试了很多博客上的方法没有找到理想的解决方案 xff0c 看了wsl help之后才知道这些方法确实十分
  • Undo Log学习

    一 Undo Log的作用 数据库故障恢复机制的前世今生中提到过 xff0c Undo Log用来记录每次修改之前的历史值 xff0c 配合Redo Log用于故障恢复 这也就是InnoDB中Undo Log的第一个作用 xff1a 1 事
  • 慢SQL解决方案

    一 全表扫描 1 案例 span class token keyword SELECT span span class token function count span span class token punctuation span
  • JAVA17新特性

    2022 年 7 月底 xff0c 甲骨文正式停止对Java SE 7的扩展支持 xff0c 一个有着近 11 年历史的 Java 标准版本迎来生命周期结束 目前最新版本的 Java18 于今年 3 月正式发布 xff0c 并将于 2022
  • 测试——单元测试,集成测试,系统测试,白盒,黑盒

    一 单元测试 1 何为单元测试 单元测试 xff08 unit testing xff09 xff0c 是指对软件中的最小可测试单元进行检查和验证 单元测试通常和白盒测试联系到一起 xff0c 如果单从概念上来讲两者是有区别的 xff0c
  • java对多媒体处理工具

    简介 JAVE Java Audio Video Encoder 类库是一个 ffmpeg 项目的 Java 语言封装 开发人员可以使用 JAVE 在不同的格式间转换视频和音频 例如将 AVI 转成 MPEG 动画 xff0c 等等 ffm

随机推荐