您的位置:首页 > 其它

Andriod trance日志分析的思路

2017-07-25 09:08 267 查看
先列出自己项目中出现的一段trance日志

----- 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 */
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  trance