虽然出现的anr各种各样,但还是将常用的分析流程写下来
1 先总体分析(看cpu,内存,io)
1,1 如果cpu过高,需要kenel日志查看各个核的情况,排除qnx异常占用问题,也有可能是大小核,cpu升降频导致的,但这个需要perfetto才能分析。
1.2 如果是内存过高,需要查看各个app的pss,rss 甚至ion占用情况来定位具体的泄漏情况
如果没有,也可以
1.2.1:通过binder kenel(binder节点文件打印出来)和上层 log 排除掉 binder泄漏导致的内存问题(搜binder关键字即可)毕竟binder泄漏是最常见的问题。
1.2.2:还可以搜索 "GC freed" 来查看对应的app是否频繁gc,一般内存紧张会触发大量的gc,进而导致低内存 anr也是一个常见的场景。
1.3 如果io占用过高,可以查看主线程或子线程释放有大量io操作,或开启了大量的子线程,或其他app io占用过高也会导致当前app anr 。
2 trace 文件打印堆栈正常的,没什么问题(比如常见的nativepollonce)要怎么分析
2.1 查看event log,查看该时间点有没有频繁的binder调用,如果同一个app频繁的binder调用systemserver某些加锁的接口(比如binderDied)
也是会引起binder队列排队等待导致当前app无法得到systemserver的相应引起anr的情况
2.2 查看event log,查看当前时间点的