一般traces.txt日志输出格式如下,本实例是在主线程中强行Sleep导致的ANR日志:
(mutexes: tll=0 tsl=0 tscl=0 ghl=0 hwl=0 hwll=0)
"main" prio=5 tid=1 Sleeping
| group="main" sCount=1 dsCount=0 obj=0x73f11000 self=0xf3c25800
| sysTid=2957 nice=0 cgrp=default sched=0/0 handle=0xf7770ea0
| state=S schedstat=( 107710942 40533261 131 ) utm=4 stm=6 core=2 HZ=100
| stack=0xff49d000-0xff49f000 stackSize=8MB
| heldmutexes=
atjava.lang.Thread.sleep!(Native method)
- sleepingon <0x31fd6f5d> (a java.lang.Object)
atjava.lang.Thread.sleep(Thread.java:1031)
- locked <0x31fd6f5d> (a java.lang.Object)
atjava.lang.Thread.sleep(Thread.java:985)
atcom.sunny.demo.MainActivity.startMethod(MainActivity.java:21)
atjava.lang.reflect.Method.invoke!(Native method)
atjava.lang.reflect.Method.invoke(Method.java:372)
atandroid.view.View$1.onClick(View.java:4015)
atandroid.view.View.performClick(View.java:4780)
atandroid.view.View$PerformClick.run(View.java:19866)
atandroid.os.Handler.handleCallback(Handler.java:739)
atandroid.os.Handler.dispatchMessage(Handler.java:95)
atandroid.os.Looper.loop(Looper.java:135)
atandroid.app.ActivityThread.main(ActivityThread.java:5254)
atjava.lang.reflect.Method.invoke!(Native method)
atjava.lang.reflect.Method.invoke(Method.java:372)
atcom.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
atcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
第1行是固定头,指明下面都是当前运行的dvm thread:“DALVIK THREADS”;
第2行输出的是改进程中各线程互斥量的值,有些手机上面可能没有这一行日志信息;
第3行输出的是线程名字(“main”),线程优先级(“prio=5”),线程id(“tid=1”),线程状态(Sleeping),比较常见的状态还有Native、Waiting;
第4行分别是线程所处的线程组 (“main”),线程被正常挂起的次处(“sCount=1”),线程因调试而挂起次数(”dsCount=0“),当前线程所关联的java线程对象(”obj=0x73f11000“)以及该线程本身的地址(“0xf3c25800”);
第5行 显示线程调度信息,分别是该线程在linux系统下得本地线程id (“ sysTid=2957”),线程的调度有优先级(“nice=0”),调度策略(sched=0/0),优先组属(“cgrp=default”)以及 处理函数地址(“handle=0xf7770ea0”);
第6行 显示更多该线程当前上下文,分别是调度状态(从 /proc/[pid]/task/[tid]/schedstat读出)(“schedstat=( 107710942 40533261 131 )”),以及该线程运行信息 ,它们是线程用户态下使用的时间值(单位是jiffies)(“utm=4”), 内核态下得调度时间值(“stm=6”),以及最后运行改线程的cup标识(“core=2”);
第7行表示线程栈的地址(“stack=0xff49d000-0xff49f000”)以及栈大小(“stackSize=8MB”);
后面是线程的调用栈信息,也是分析ANR的核心所在。