android中的jstack,看看线程都在干嘛

之前做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里可以看到下面这样的输出:

引用
I/dalvikvm( 2596): Wrote stack traces to '/data/anr/traces.txt'

如果没有/data/anr可能会失败。需要手动建一个目录

用adb把文件拉下来

引用
% adb pull /data/anr/traces.txt .

线程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)

相关推荐