解决方法
最简单的方法是使用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,因此无论如何都无法从中获取堆栈跟踪.