Andriod trance日志分析的思路

来源:互联网 发布:excel多列数据找相同 编辑:程序博客网 时间:2024/06/01 09:54

先列出自己项目中出现的一段trance日志

----- pid 9576 at 2017-06-26 15:42:16 -----Cmd line: com.xinwei.pnasJNI: 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 */

原创粉丝点击