trace文件获取
标准做法是adb pull /data/anr/traces.txt
。
如果碰到没有权限的情况,用adb bugreport
生成,然后adb pull生成目录下的文件出来,解压会得到一个bugreport-***.txt
的文件,这个文件里面就有trace信息,文件里面搜VM TRACES AT LAST ANR
定位最后一次anr的trace信息。
主线程忙等
看第一个ANR
的trace,如下图
上图可以看出UI线程lock 0x0799e5b8
然后又在wait 0x0799e5b8
,是一个Object调用wait后等待notfiy。ANR
发生的时候,UI线程正在等这个notify,但是没有等到,这个时候在运行的是at com.a.b.c.d(c.java:746)
,可以得出结论是这个里面执行了一个耗时操作。
死锁
下面看一个死锁的trace
上图可以比较容易看出线程Thread-0
锁住了<0x00000007d56540a0>
在等<0x00000007d5656180>
。而Thread-1
锁住了<0x00000007d5656180>
在等<0x00000007d56540a0>
,所以这两个线程就造成了死锁。