写点什么

Android 产生 ANR 后的 Trace 文件的解析

作者:北洋
  • 2022 年 6 月 09 日
  • 本文字数:1316 字

    阅读完需:约 4 分钟


第一个框中第一二行说明了发生 ANR 的进程 ID,名称和时间第三个框中=="main" prio=5 tid=1 Native==说明了线程名称,线程优先级,线程锁 id 和线程状态。tid 不是线程 id,是一个在 Java 虚拟机中用来实现线程锁的变量,线程状态分为以下几类:状态 值 说明 THREAD_ZOMBIE 0 TERMINATED 线程死亡,终止运行 THREAD_RUNNING 1 RUNNABLE or running now 线程可运行或正在运行 THREAD_TIMED_WAIT 2 TIMED_WAITING in Object.wait() 执行了带有超时参数的 wait,sleep 或 join 参数 THREAD_MONITOR 3 BLOCKED on a monitor 线程阻塞,等待获取对象锁 THREAD_WAIT 4 执行了无超时参数的 wait()函数 THREAD_INITIALIZING 5 allocated not yet running 新建,正在初始化,为其分配资源 THREAD_STARTING 6 started not yet on thread list 新建,正在启动 THREAD_NATIVE 7 off in a JNI native method 正在执行 JNI 本地函数 THREAD_VMWAIT 8 waiting on a VM resource 正在等待 VM 资源 THREAD_SUSPENDED 9 suspended usually by GC or debugger 线程暂停,通常是由于 GC 或者 debug 被暂停特别说明线程状态为 MONITOR 和 SUSPEND。MONITOR 状态一般是类的同步块或者同步方法造成的,而 SUSPEND 状态是 debugger 的时候会出现,可以用来区别是不是真的是用户正常操作跑出来 ANR


==| group="main" sCount=1 dsCount=0 flags=1 obj=0x74491f18 self=0xe5490000==后面一行 group 为线程组名称,sCount 是线程被挂起的次数,dsCount 是线程被调试器挂起的次数。当一个进程开始调试后 sCount 会变为 0,调试结束判断是否被正常挂起进行增长,但是 dsCount 不会变为 0,所以 dsCount 可以用来判断这个线程是否被调试过,obj 为线程 java 对象的地址,self 表示这个线程本身的地址


==| sysTid=14761 nice=-10 cgrp=default sched=0/0 handle=0xe90e9494==在此后是线程的调度信息:sysTid 是 Linux 下的内核线程 ID,nice 是线程的调度优先级,sched 分别标志了线程的调度策略和优先级,cgrp 是调度数组,handle 是线程的处理函数地址


==| state=S schedstat=( 808116553592 297347340368 970474 ) utm=71464 stm=9347 core=3 HZ=100==接着 state 是调度状态,utm 是线程用户态下使用的时间值,stm 是内核态下的调度时间值,core 是最后执行这个线程的 cpu 核的序号至此 trace 解析差不多完成。


大部分情况下 trace 文件顶部的线程一般是 ANR 的元凶,但是也有可能不是应用造成的 ANR。死锁和等待也会造成 ANR,比如线程状态为 MONITOR 的时候正在执行一个同步块,但是锁却被另外一个线程拿着造成主线程阻塞(等待);死锁的分析也是类似,发生死锁的线程一般处于 MONITOR 状态或者 WAIT 状态,等待其他进程的锁或者 monitor,而其他进程又在等待另外线程的锁或者 monitor,一直这样依赖下去,直到形成一个环。


(参考链接:1.https://blog.csdn.net/yxz329130952/article/details/50087731/2.https://blog.csdn.net/lovelease/article/details/819886963.https://www.cnblogs.com/wanqieddy/archive/2013/12/26/3492373.html

发布于: 刚刚阅读数: 3
用户头像

北洋

关注

Android开发 2021.05.25 加入

记录Android学习之路 分享读书心得体会~

评论

发布
暂无评论
Android 产生ANR后的Trace文件的解析_android_北洋_InfoQ写作社区