如何在Android中制作Java Thread Dump?

Div*_*ano 9 java android dump

我只想从java虚拟机线程中获取所有转储,查看线程锁定的内容以及等待解锁某些资源的线程.像这里描述的东西.我试图杀死Zygote进程,但没有结果.

fad*_*den 16

最简单的方法是使用DDMS,或Eclipse中的ADT插件.有关基本说明,请参见 http://developer.android.com/tools/debugging/ddms.html.简而言之,进入"设备"视图,选择您感兴趣的应用程序,确保启用了线程更新,然后切换到"线程"视图.您将在该过程中获得实时更新的线程列表.双击线程将获取当前堆栈状态的快照.

您可以在线程转储中使用select-all和copy来复制和粘贴堆栈跟踪.

如果你有一个开发人员/ root用户设备,你可以通过发送一个SIGQUIT你感兴趣的应用程序进程来要求Dalvik VM转储线程堆栈.例如,如果你想查看Calendar应用程序中所有线程的堆栈,你可以这样做:

% adb shell ps | grep android.calendar
u0_a6     2596  127   912804 48296 ffffffff b6f62c10 S com.google.android.calendar
# 2596 is the process ID
% adb shell run-as com.google.android.colendar kill -3 2596
Run Code Online (Sandbox Code Playgroud)

logcat输出会说:

I/dalvikvm( 2596): Wrote stack traces to '/data/anr/traces.txt'
Run Code Online (Sandbox Code Playgroud)

所以,拉出来:

% adb pull /data/anr/traces.txt .
Run Code Online (Sandbox Code Playgroud)

每次发出进程信号时,日志都会附加到该文件中.那里可能还有其他东西,所以你需要搜索pid 2596:

----- pid 2596 at 2012-11-27 12:48:38 -----
Cmd line: com.google.android.calendar

DALVIK THREADS:
...
Run Code Online (Sandbox Code Playgroud)

在DDMS线程视图上执行此操作的优点是,如果线程卡在监视器上,则堆栈转储将指示锁定了哪个对象以及当前持有锁的哪个线程.

受精卵过程与此无关; 根据定义,它没有运行应用程序.由于它没有JDWP线程,并且不监听SIGQUIT,因此无论如何都无法从中获取堆栈跟踪.


Mar*_*sny 8

只需在 Android Studio 中的手机上调试您的应用;然后在“调试视图”中,Alt+5只需按下左下角的“相机”按钮,即可获得所有堆栈跟踪的转储,包括他们持有的锁。


Chr*_*aan 0

如果您切换到 Eclipse 中的 DDMS 视图,您可以使用一些工具来查看线程。这就是您要找的吗?