繁体   English   中英

如何在 Android 中进行 Java 线程转储?

[英]How to make Java Thread Dump in Android?

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

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

您可以在线程转储中使用全选和复制来复制和粘贴堆栈跟踪。

如果您有开发者/root 设备,您可以通过向您感兴趣的应用程序进程发送SIGQUIT来要求 Dalvik VM 转储线程堆栈。例如,如果您想查看日历应用程序中所有线程的堆栈,你可以这样做:

% 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,因此无论如何您都无法从中获取堆栈跟踪。

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

答案中获取命令,并将它们放在一起,这是以下脚本。 将其放入 dump.sh 文件并执行,它将找到所需的 PID,创建一个具有当前时间戳的新文件,然后将 Thread-Dump 提取到其中。 当获取转储的时间很短时,此命令很有用。 在使用之前,请确保将 traces 放入文件/data/anr/traces.txt或替换脚本中的此值。

#!/bin/sh

pid=`./adb shell ps | grep android.calendar | awk '{print $2}'`
echo $pid
f=$(date +%s%N)
echo $f
./adb shell run-as com.google.android.calendar kill -3 $pid
./adb pull /data/anr/traces.txt $f

作为替代文件名,可以使用f=$(date +"%T.%6N")来获取人类可读的时间戳。 找到所需的文件会更容易。

如果您没有 root 设备并且您的应用程序不是调试版本,您仍然可以从开发人员选项生成错误报告以获取线程转储。 转储位于 bugreport*.txt 文件的 VM TRACES JUST NOW 部分下。

如果您知道您怀疑的线程的 ID,它会更快。 您可以通过调用获取应用程序的 PID:

adb shell ps -A | grep com.example.myapp

和线程ID:

adb shell ps -T | grep <pid>

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

我猜你需要应用程序中的线程。 为此,您可以使用 ADT eclipse 插件上的 DDMS 视图。 这是文档http://developer.android.com/tools/debugging/ddms.html#thread

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM