静博圣宇 2013-12-15
之前做java开发的时候,遇到进程卡住的情况都会用jstack来打印一个进程里的线程活动情况。到了安卓开发,发现没有这个命令了,很不习惯。
google了一下,发现还是有办法的。
% adb shell ps | grep android.calendar u0_a6 2596 127 912804 48296 ffffffff b6f62c10 S com.google.android.calendar
2596就是进程ID
% adb shell kill -3 2596
成功的话logcat里可以看到下面这样的输出:
如果没有/data/anr可能会失败。需要手动建一个目录
用adb把文件拉下来
线程DUMP是以附加的形式打到traces.txt上面的。所以要根据PID来确认。
这个对于排查程序无响应很有帮助。
参考:http://stackoverflow.com/questions/13589074/how-to-make-java-thread-dump-in-android
打印出来的文件大致如下:-----pid155at2013-12-1120:38:16-----
Cmdline:system_server
DALVIKTHREADS:
(mutexes:tll=0tsl=0tscl=0ghl=0)
"main"prio=5tid=1NATIVE
|group="main"sCount=1dsCount=0obj=0x40a3d460self=0x12800
|sysTid=155nice=0sched=0/0cgrp=defaulthandle=1074083080
|schedstat=(29667200085598000170)utm=19stm=10core=0
atcom.android.server.SystemServer.init1(NativeMethod)
atcom.android.server.SystemServer.main(SystemServer.java:1103)
atjava.lang.reflect.Method.invokeNative(NativeMethod)
atjava.lang.reflect.Method.invoke(Method.java:511)
atcom.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
atcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
atdalvik.system.NativeStart.main(NativeMethod)
"DhcpStateMachine"prio=5tid=66NATIVE
|group="main"sCount=1dsCount=0obj=0x411a3b30self=0x18dfa0
|sysTid=443nice=0sched=0/0cgrp=defaulthandle=1660872
|schedstat=(30460004809100054)utm=0stm=0core=0
atandroid.os.MessageQueue.nativePollOnce(NativeMethod)
atandroid.os.MessageQueue.next(MessageQueue.java:118)
atandroid.os.Looper.loop(Looper.java:118)
atandroid.os.HandlerThread.run(HandlerThread.java:60)