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

简介: Android 产生ANR后的Trace文件的解析


第一个框中第一二行说明了发生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/81988696

3.https://www.cnblogs.com/wanqieddy/archive/2013/12/26/3492373.html


目录
相关文章
|
13天前
|
Shell Android开发
Android系统 adb shell push/pull 禁止特定文件
Android系统 adb shell push/pull 禁止特定文件
19 1
|
13天前
|
Shell Android开发
Android系统 init.rc文件详解
Android系统 init.rc文件详解
29 0
|
14天前
|
存储 Java API
Android 浅度解析:mk预置AAR、SO文件、APP包和签名
Android 浅度解析:mk预置AAR、SO文件、APP包和签名
59 0
|
14天前
|
安全 Java 定位技术
Android 浅度解析:AIDL & Binder (1)
Android 浅度解析:AIDL & Binder (1)
38 0
|
6天前
|
弹性计算 运维 Shell
|
6天前
|
前端开发 测试技术 数据处理
安卓开发中的MVP架构模式深度解析
【4月更文挑战第30天】在移动应用开发领域,模型-视图-呈现器(Model-View-Presenter, MVP)是一种广泛采用的架构模式。它旨在通过解耦组件间的直接交互来提高代码的可维护性和可测试性。本文将深入探讨MVP在安卓开发中的应用,揭示其如何促进代码的模块化,提升用户界面的响应性,并简化单元测试过程。我们将从理论概念出发,逐步过渡到实践案例,为读者提供一套行之有效的MVP实施策略。
|
9天前
|
移动开发 数据可视化 Linux
Linux 中的文件与目录管理解析
当谈到Linux系统,文件与目录管理是其中最基本和重要的部分之一。Linux提供了一种强大而灵活的方式来组织和管理文件和目录,让用户能够轻松地访问和操作系统中的各种数据。上一节我们说到文件的属性,本文将详细介绍Linux中的文件与目录管理的各个方面。
|
9天前
|
Linux Go 数据安全/隐私保护
Linux 中的文件属性解析
在 Linux 系统中,每个文件和目录有一组属性控制其操作和访问权限。了解这些属性对有效管理文件至关重要。文件属性包括:文件类型(如 `-` 表示普通文件,`d` 表示目录),权限(如 `rwx` 表示所有者权限,`r-x` 表示组和其他用户权限),所有者,组,硬链接数,文件大小和最后修改时间。通过 `chown` 和 `chmod` 命令可更改文件所有者、所属组及权限。此外,还有特殊权限(如 SUID、SGID)和 ACL(访问控制列表)提供更精细的访问控制。
|
13天前
|
Java Android开发 C++
Android源代码定制:MK文件执行顺序|属性覆盖
Android源代码定制:MK文件执行顺序|属性覆盖
17 2
Android源代码定制:MK文件执行顺序|属性覆盖
|
13天前
|
存储 Java API
Android系统 文件访问权限笔记
Android系统 文件访问权限笔记
46 1

推荐镜像

更多