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 */
- Andriod trance日志分析的思路
- TRANCE宏的利用
- Andriod的activity生命周期分析
- 行为日志分析思路与想法
- Trance分类
- 高效的分析思路
- 算法的分析思路
- 算法的分析思路
- 算法的分析思路
- SBO系统中销售订单日志的跟踪统计思路分析
- 关于Android中处理崩溃异常和分析日志的两种思路
- Andriod系统的Input设备分析二
- Andriod系统的Input设备分析二
- andriod 命令行窗口查看logcat输出的日志
- elk 日志处理的一点思路
- 模板抽取思路的分析
- Hadoop源码分析的思路
- I2C不通的分析思路
- MaterialDesign的Toolbar以及Drawerlayout
- EM算法理解
- Python 建立一个模型来识别验证码成功率
- springloaded热部署
- 如何使用JavaScript根据图片获取条形码
- Andriod trance日志分析的思路
- hibernate ,criteria关联查询
- 面向对象方法学的四个要点
- 自然语言处理-实际开发:用语义开放平台olami写一个翻译的应用
- spark broadcast side join实例
- spring中applicationContext中配置aop的注意事项
- [LeetCode] 405. Convert a Number to Hexadecimal
- 如何设计出优秀的LOGO?设计大神告诉你!
- 搭建Hadoop分布式开发环境(一)