微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Android中制作Java Thread Dump?

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

解决方法

最简单的方法是使用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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐