作者:sl51866 | 来源:互联网 | 2023-09-16 15:11
一、概述Android6.0系统采用的art虚拟机,所有的Java进程都运行在art之上,当应用发生ANR(ApplicationNotResponse,其中最终的一个环节便是向目标进程发送
一、概述
Android 6.0系统采用的art虚拟机,所有的Java进程都运行在art之上,当应用发生ANR(Application Not Response,其中最终的一个环节便是向目标进程发送信号SIGNAL_QUIT, 传统的linux则是终止程序并输出core;而对于Android进程来说当收到SIGQUIT时,Java层面的进程都是跑在虚拟机之上的,ART虚拟机会捕获该信号,并输出相应的traces信息保存到目录/data/anr/traces.txt。
当然也可以通过一条命令来获取指定进程的traces信息,例如输出pid=888的进程信息:
执行完该命令后traces信息的结果保存到文件/data/anr/traces.txt,如下:
实例:
"Binder_1" prio=5 tid=8 Native | group="main" sCount=1 dsCount=0 obj=0x12c610a0 self=0x5573e5c750 | sysTid=12092 nice=0 cgrp=default sched=0/0 handle=0x7fa2743450 | state=S schedstat=( 796240075 863170759 3586 ) utm=50 stm=29 core=1 HZ=100 | stack=0x7fa2647000-0x7fa2649000 stackSize=1013KB | held mutexes=
解释:
- 第一行:线程名(“Binder_1”)(如果带有daemon说明是守护线程,线程优先级(“prio=5”),线程内部id(“tid=8”),线程状态(“NATIVE”)。
- 第二行: 线程所属的线程组 (“main”),线程挂起次数(“sCount=1”),用于调试的线程挂起次数(”dsCount=0“), 当前线程关联的java线程对象(”obj=0x12c610a0“),该线程地址(“self=0x5573e5c750”)。
- 第三行:线程真正意义上的tid(“sysTid=12092”),调度有优先级(“nice=0”), 优先组属(“cgrp=default”),调度策略(sched=0/0), 处理函数地址(“handle=0x7fa2743450”)
- 第四行: 线程状态(S), 调度时间统计schedstat,线程用户态下使用的时间值(单位是jiffies)(“utm=50”), 内核态下得调度时间值(“stm=20”),最后运行该线程的核(“core=1”)
- 第五行:线程栈的地址区间(“0x7fa2647000-0x7fa2649000”),以及栈的大小(“1013KB”)
- 第六行:所持有的mutex类型,有独占锁exclusive和共享锁shared两类。
说明:
- CPU调度统计信息(schedstat):通过读取节点
/proc/[pid]/task/[tid]/schedstat
- CPU使用统计:通过读取节点
/proc/self/task/[tid]/stat
- 内核栈:通过读取节点
/proc/self/task/[tid]/stack
- jiffies系统的节拍数,该值是1/HZ,一般来说100HZ,也就意味着1jiffies = 10ms.
- 线程状态:除了Native,另外还有Running, Blocked等状态,进程没有依附的状态(not attached)
转自:http://gityuan.com/2016/11/26/art-trace/