我需要监控应用程序的行为并收集有关如何创建/销毁线程的统计信息。我知道DDMS有一个线程视图,可以实时显示这些信息,但是我可以通过命令行获得相同的信息吗?我想创建自己的工具,记录这些信息及其过程。
澄清: 我正在寻找的是一个可以通过ADB传递的命令,它将列出在进程下运行的线程。这样,我可以在不同的时间点运行命令,以获得一段时间内所有线程的状态(线程数和它们的名称)。
答案 0 :(得分:7)
有两种方法可以做到这一点 在Ubuntu 12.10的摩托罗拉Moto G上试过这个问题
您可以使用top
(在ADB Shell下)列出所有设备上运行的线程。
$ top -t
PID TID PR CPU% S VSS RSS PCY UID Thread Proc
271 895 1 0% S 11120K 1892K root netd /system/bin/netd
272 272 0 0% S 1040K 200K root debuggerd /system/bin/debuggerd
274 274 2 0% S 63256K 7008K fg system surfaceflinger /system/bin/surfaceflinger
274 451 0 0% S 63256K 7008K fg system Binder_1 /system/bin/surfaceflinger
因此,要获取任何特定流程的详细信息,您可以使用grep
$ top -t | grep com.whatsapp
PID TID PR CPU% S VSS RSS PCY UID Thread Proc
15210 15210 0 0% S 550076K 51180K bg u0_a96 com.whatsapp com.whatsapp
15210 15214 0 0% S 550076K 51180K bg u0_a96 GC com.whatsapp
15210 15215 0 0% S 550076K 51180K bg u0_a96 Signal Catcher com.whatsapp
15210 15216 0 0% S 550076K 51180K bg u0_a96 Compiler com.whatsapp
要在主机上运行此功能,请使用
$ adb shell top -t | grep com.whatsapp
如果不支持grep
,请使用Busybox。
如果您正在寻找静态视图。您也可以使用ps
。
$ ps -p 15210 -t
USER PID PPID VSIZE RSS PRIO NICE RTPRI SCHED WCHAN PC NAME
u0_a96 15210 275 549036 52136 20 0 0 0 ffffffff 00000000 S com.whatsapp
u0_a96 15214 15210 549036 52136 20 0 0 0 ffffffff 00000000 S GC
u0_a96 15215 15210 549036 52136 20 0 0 0 ffffffff 00000000 S Signal Catcher
u0_a96 15216 15210 549036 52136 20 0 0 0 ffffffff 00000000 S Compiler
15210
是您的流程的PID com.whatsapp
希望这能解决您的问题,让我知道它是否有效。
答案 1 :(得分:1)
在我有限的知识中,并且我可能完全错了,请看看:
public static Map<Thread,StackTraceElement[]> getAllStackTraces()
文档:http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#getAllStackTraces()
返回所有活动线程的堆栈跟踪映射。地图键是 线程和每个map值都是StackTraceElement的数组 表示相应Thread的堆栈转储。归来了 堆栈跟踪采用为getStackTrace方法指定的格式。 调用此方法时,线程可能正在执行。堆栈 每个线程的跟踪仅代表一个快照和每个堆栈跟踪 可以在不同的时间获得。零长度数组将是 如果虚拟机没有堆栈跟踪,则返回映射值 有关线程的信息。
我希望有所帮助。