Android ANR之traces日志线程参数解析
在Android开发过程中,ANR(Application Not Responding)问题是影响用户体验的重要因素之一。当应用出现ANR时,系统会生成traces.txt日志文件,这对于定位和解决问题至关重要。本文将深入解析traces日志中的线程参数含义,帮助开发者更好地理解和分析ANR问题。
traces日志简介
traces.txt日志通常在以下情况下生成:
- 执行
adb shell kill -3 pid - 进程发生ANR或native crash等故障时
日志默认输出到 /data/anr/ 目录下,主要包括发生ANR时的资源使用情况以及各个线程的状态信息。
核心线程参数解析
以下是一个典型的线程状态示例:
"main" prio=5 tid=1 Native
| group="main" sCount=1 dsCount=0 flags=1 obj=0x74cb56d8 self=0xeb6ca000
| sysTid=8072 nice=-10 cgrp=default sched=0/0 handle=0xeffe9494
| state=S schedstat=( 1457862132 142332556 1571 ) utm=114 stm=31 core=4 HZ=100
| stack=0xff195000-0xff197000 stackSize=8MB
| held mutexes=
第一行参数解析
线程名称
"main" prio=5 tid=1 Native
-
"main": 线程名称。"main"表示主线程,"Binder:8072_2"表示Binder线程,"Signal Catcher" daemon表示守护线程Signal Catcher。
线程优先级
-
prio=5: Java线程优先级,取值范围 [1, 10],数值越高优先级越高。
线程ID
-
tid=1: 进程内部线程ID,一般较小。
线程状态
-
Native: 表示线程当前处于Native状态。
第二行参数解析
线程组
| group="main" sCount=1 dsCount=0 flags=1 obj=0x74cb56d8 self=0xeb6ca000
-
group="main": 线程所属的线程组,默认情况下所有线程都属于主线程组。
挂起计数
-
sCount=1: 线程被挂起的次数。
调试挂起计数
-
dsCount=0: 用于调试的线程挂起次数。
线程标志
-
flags=1: 线程的各种标志位。
Java线程对象
-
obj=0x74cb56d8: 当前线程关联的Java线程对象地址。
线程自身地址
-
self=0xeb6ca000: 当前线程自身的地址。
第三行参数解析
系统线程ID
| sysTid=8072 nice=-10 cgrp=default sched=0/0 handle=0xeffe9494
-
sysTid=8072: Linux内核分配的线程ID,在系统中是唯一的。
调度优先级
-
nice=-10: 线程的调度优先级,取值范围 [-20, 19],数值越小优先级越高。
控制组
-
cgrp=default: 线程所属的进程调度组(Control Groups),用于限制、控制和分离进程组的资源。
调度策略和优先级
-
sched=0/0: 分别表示线程的调度策略和优先级。
处理函数地址
-
handle=0xeffe9494: 线程的处理函数地址。
第四行参数解析
调度状态
| state=S schedstat=( 1457862132 142332556 1571 ) utm=114 stm=31 core=4 HZ=100
-
state=S: 线程的调度状态,S表示可中断睡眠状态。
CPU调度统计
-
schedstat=( 1457862132 142332556 1571 ): CPU调度时间统计,分别表示线程在CPU上执行的时间、线程的等待时间和线程执行的时间片长度。
用户态和内核态时间
-
utm=114 stm=31: 用户态(utm)和内核态(stm)下使用CPU的时间(单位是jiffies)。
CPU核心
-
core=4: 最后执行该线程的CPU核心序号。
系统时钟频率
-
HZ=100: 全局变量jiffies每秒增加的数量,HZ=100表示每秒增加100个jiffies。
第五行参数解析
栈空间信息
| stack=0xff195000-0xff197000 stackSize=8MB
-
stack=0xff195000-0xff197000: 线程栈的地址区间。 -
stackSize=8MB: 线程栈的大小,主线程默认为8MB,子线程稍小于1MB。
第六行参数解析
持有的互斥锁
| held mutexes=
-
held mutexes=: 线程持有的mutex类型,包括独占锁(exclusive)和共享锁(shared)。
总结
理解traces日志中的线程参数对于分析ANR问题至关重要。通过对这些参数的深入解析,我们可以获得以下关键信息:
- 线程的基本属性(名称、优先级、ID等)
- 线程的调度状态和CPU使用情况
- 线程的栈空间信息
- 线程持有的锁资源
掌握这些信息有助于快速定位导致ANR的具体原因,从而采取针对性的优化措施。
参考文章:
https://blog.csdn.net/wudexiaoade2008/article/details/105020269/









网友评论