[英]How to make Java Thread Dump in Android?
最简单的方法是使用 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.