Andriod trance日志分析的思路
2017-07-25 09:08
267 查看
先列出自己项目中出现的一段trance日志
特别说明一下MONITOR状态和SUSPEND状态,
MONITOR状态一般是类的同步块或者同步方法造成的,SUSPENDED状态在debugger的时候会出现,可以用来区别是不是真的是用户正常操作跑出了ANR。
main prio=5 tid=1 NATIVE
说明了线程名称、线程的优先级、线程锁id和线程状态。线程名称是启动线程的时候手动指明的,这里的main标识是主线程,是Android自动设定的一个线程名称,如果是自己手动创建的线程,一般会被命名成“Thread-xx”的格式,其中xx是线程id,它只增不减不会被复用;注意这其中的tid不是线程的id,它是一个在Java虚拟机中用来实现线程锁的变量,随着线程的增减,这个变量的值是可能被复用的;最后线程的状态还分为如下几种
从trace文件可以看出,发生ANR的主线程正处于monitor状态,也就是它在等待一个synchronized块或者方法,但是目前这个monitor正在被tid=11的线程持有,所以造成了主线程被阻塞,从而发生了ANR。死锁的分析也是类似,发生死锁的线程一般处于MONITOR状态或者WAIT状态,等待其他进程的锁或者monitor,而其他进程又在等待另外线程的锁或者monitor,一直这样依赖下去,直到形成一个环。
Thread状态
[java] view plain copy print?
ThreadState (defined at “dalvik/vm/thread.h “)
THREAD_UNDEFINED = -1, /* makes enum compatible with int32_t */
THREAD_ZOMBIE = 0, /* TERMINATED */
THREAD_RUNNING = 1, /* RUNNABLE or running now */
THREAD_TIMED_WAIT = 2, /* TIMED_WAITING in Object.wait() */
THREAD_MONITOR = 3, /* BLOCKED on a monitor */
THREAD_WAIT = 4, /* WAITING in Object.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 */
THREAD_VMWAIT = 8, /* waiting on a VM resource */
THREAD_SUSPENDED = 9, /* suspended, usually by GC or debugger */
----- pid 9576 at 2017-06-26 15:42:16 ----- Cmd line: com.xinwei.pnas JNI: CheckJNI is off; workarounds are off; pins=0; globals=385 (plus 3 weak) DALVIK THREADS: (mutexes: tll=0 tsl=0 tscl=0 ghl=0) "main" prio=5 tid=1 NATIVE | group="main" sCount=1 dsCount=0 obj=0x41db6cd8 self=0x41da53a8 | sysTid=9576 nice=0 sched=0/0 cgrp=apps handle=1074602324 | state=R schedstat=( 12918121305 48982818656 34050 ) utm=1094 stm=197 core=0 #00 pc 00021984 /system/lib/libc.so (__futex_syscall3+8) #01 pc 0000efa4 /system/lib/libc.so "XWH264Decoder" prio=5 tid=40 WAIT | group="main" sCount=1 dsCount=0 obj=0x430c9360 self=0x602f8348 | sysTid=10630 nice=0 sched=0/0 cgrp=apps handle=1650983264 | state=S schedstat=( 1231109617 9293579108 10180 ) utm=88 stm=35 core=0 at java.lang.Object.wait(Native Method) - waiting on <0x430c93f0> (a java.lang.VMThread) held by tid=40 (XWH264Decoder) at java.lang.Thread.parkFor(Thread.java:1205) at sun.misc.Unsafe.park(Unsafe.java:325) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:157) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2017) at java.util.concurrent.ArrayBlockingQueue.take(ArrayBlockingQueue.java:373) at com.xinwei.sdc.media.video.XWH264Decoder$1.run(XWH264Decoder.java:72)
特别说明一下MONITOR状态和SUSPEND状态,
MONITOR状态一般是类的同步块或者同步方法造成的,SUSPENDED状态在debugger的时候会出现,可以用来区别是不是真的是用户正常操作跑出了ANR。
main prio=5 tid=1 NATIVE
说明了线程名称、线程的优先级、线程锁id和线程状态。线程名称是启动线程的时候手动指明的,这里的main标识是主线程,是Android自动设定的一个线程名称,如果是自己手动创建的线程,一般会被命名成“Thread-xx”的格式,其中xx是线程id,它只增不减不会被复用;注意这其中的tid不是线程的id,它是一个在Java虚拟机中用来实现线程锁的变量,随着线程的增减,这个变量的值是可能被复用的;最后线程的状态还分为如下几种
从trace文件可以看出,发生ANR的主线程正处于monitor状态,也就是它在等待一个synchronized块或者方法,但是目前这个monitor正在被tid=11的线程持有,所以造成了主线程被阻塞,从而发生了ANR。死锁的分析也是类似,发生死锁的线程一般处于MONITOR状态或者WAIT状态,等待其他进程的锁或者monitor,而其他进程又在等待另外线程的锁或者monitor,一直这样依赖下去,直到形成一个环。
Thread状态
[java] view plain copy print?
ThreadState (defined at “dalvik/vm/thread.h “)
THREAD_UNDEFINED = -1, /* makes enum compatible with int32_t */
THREAD_ZOMBIE = 0, /* TERMINATED */
THREAD_RUNNING = 1, /* RUNNABLE or running now */
THREAD_TIMED_WAIT = 2, /* TIMED_WAITING in Object.wait() */
THREAD_MONITOR = 3, /* BLOCKED on a monitor */
THREAD_WAIT = 4, /* WAITING in Object.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 */
THREAD_VMWAIT = 8, /* waiting on a VM resource */
THREAD_SUSPENDED = 9, /* suspended, usually by GC or debugger */
相关文章推荐
- Python写WEB日志分析程序的一些思路
- 关于Android中处理崩溃异常和分析日志的两种思路
- python(2):使用python分析大日志文件思路及过程
- SQL Server日志分析程序开发思路
- SBO系统中销售订单日志的跟踪统计思路分析
- Linux中的日志分析及管理
- 日志分析(php+nosql+rsync+crontable)
- ORACLE死锁故障排查的一般性手法的备忘录/分析死锁日志
- android日志系统源码分析
- Android实现换肤的两种思路分析
- Mycat学习笔记 番外篇一.客户端使用latin1字符集,后端MySQL为UTF8字符集,MyCat日志分析。
- MySQL系列之三:慢查询日志及分析
- 日志分析查看——grep,sed,sort,awk运用
- 从零编写日志分析系统之filebeat安装配置
- 在linux下使用webalizer与awstats实现apache服务器的日志分析
- 开源实时日志分析ELK平台部署
- VS2003 C#开发ArcEngine 9.0不能调试的分析思路
- nginx日志分析工具goaccess
- python 分析nginx日志,并尝试一下stdin
- ELK(ElasticSearch, Logstash, Kibana)搭建实时日志分析平台