如何在Android中制作Java Thread Dump?

2022-09-03 10:07:51

我只想从java虚拟机线程中获取所有转储,看看线程锁定了什么,以及哪些线程等待解锁一些资源。这里描述了类似的东西。我试图杀死Zygote过程,但没有结果。


答案 1

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

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

如果你有开发人员/root 设备,你可以要求 Dalvik VM 通过向你感兴趣的应用发送一个进程来转储线程堆栈。例如,如果要查看“日历”应用中所有线程的堆栈,可以执行如下操作:SIGQUIT

% 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

logcat 输出将如下所示:

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

所以,拉它:

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

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

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

DALVIK THREADS:
...

与 DDMS 线程视图相比,这样做的优点是,如果线程卡在监视器上,堆栈转储将指示锁定的对象以及当前持有锁定的线程。

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


答案 2

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


推荐