ANR 分析流程
ANR 分析流程
一、基本流程
1.确定anr发生的时间(通过event_log搜索“am_anr”或打印trace时间点判断)
2.查看CPU占用情况(通过adblog搜索"ANR in",搜索total关键字,查看CPU的整体使用情况)
3.查看Trace文件,分析主线程等是否存在明显的阻塞与sleep
步骤一
如果log很全的情况下在确定了anr的时间点后,找到应用的进程,在log中直接主进程号,可以快速的定位问题大致发生的时间节点
如图定位到问题进程号为5231 ,此时过滤主进程,结合anr发生的时间点,则可以定位到问题发生的代码大致在组件初始化附近
步骤二
CPU已接近100% ,其中 kswapd已达40% Total里面kernel已达50% ,,说明低内存严重,kswapd一般不会超过25%。 这么高说明内存碎片多,或者kernel不断的在回收
从log中可以看到,地区系统遇到了低内存的情况,在进行回收,这种情况查看应用自身的占比是否偏高,若无偏高,一般不是应用自身的问题
CPU分析中各个字段的含义如下:
字段 | 含义 |
---|---|
user | CPU在用户态的运行时间,不包括nice值为负数的进程运行的时间 |
nice | CPU在用户态,nice值为负数的进程运行的时间 |
system | CPU在内核态运行的时间 |
idle | CPU空闲时间,不包括iowait时间 |
iowait | CPU等待I/O操作的时间 |
irq | CPU硬中断的时间 |
softirq | CPU软中断的时间 |
步骤三
主线程阻塞,阻塞原因为等待线程号为13的线程释放锁
线程13号的getExternalCacheDir方法持有了锁,一直未释放导致,问题已定位,可以根据具体原因去处理遇到的问题