我只想從java虛擬機線程獲取所有轉儲,查看線程鎖定的內容以及等待解鎖某些資源的線程。類似於here。 我試圖殺死Zygote過程,但沒有結果。如何在Android中進行Java線程轉儲?
回答
如果您在Eclipse中切換到DDMS視圖,您可以使用一些工具來查看線程。那是你在找什麼?
我猜你需要應用程序中的線程。爲此,您可以使用ADT eclipse插件上的DDMS視圖。這裏是文檔http://developer.android.com/tools/debugging/ddms.html#thread
差不多是的。我還不知道對象是什麼鎖定的,例如: - locked <0x0000000780b7e688>(a java.io.InputStreamReader) – Divano
Eclipse和DDMS已棄用,Android Profiler將不顯示任何內容。請閱讀下面的答案。 –
最簡單的方法是使用DDMS或Eclipse中的ADT插件。有關基本說明,請參見http://developer.android.com/tools/debugging/ddms.html。簡而言之,進入設備視圖,選擇您感興趣的應用程序,確保線程更新已啓用,然後切換到線程視圖。您將在該過程中獲得實時更新的線程列表。雙擊線程將抓取當前堆棧狀態的快照。
您可以使用select-all並複製線程轉儲以複製&粘貼堆棧跟蹤。
如果你有一個開發者/ root權限的設備,你可以問的Dalvik虛擬機通過發送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線圖的優點是,如果線程被卡在監視器上,堆棧轉儲會給你指示什麼對象被鎖定,哪個線程當前持有鎖。
zygote過程在這裏不相關;根據定義它沒有運行一個應用程序。由於它沒有JDWP線程,並且不偵聽SIGQUIT,所以無論如何您都無法獲取堆棧跟蹤。
注意:我在/data/anr/traces.txt.bugreport找到了我的蹤跡 –
有更簡單的方法,請閱讀以下內容。 –
接受answer的命令,並將它們放在一起,下面是腳本。把它放到dump.sh文件中並執行,它會找到所需的PID,用當前的時間戳創建一個新文件,接下來它將把Thread-Dump存入它。 當有一個非常短的時間來獲取轉儲時,此命令可能很有用。 在使用之前,請確保將跟蹤放入文件/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")
讓人類可讀的時間戳。找到所需的文件會更容易。
有更簡單的方法,請閱讀下面的答案。 –
有時你不能使用斷點。對於這些情況你使用這個腳本。 –
只需在Android Studio中在手機上調試您的應用程序;然後在「調試視圖」Alt+5
中,只需按下左下角的「攝像頭」按鈕即可獲取所有堆棧軌跡的轉儲,包括它們所持有的鎖定。
- 1. 如何在heroku上爲Java進程生成線程轉儲?
- 2. 分析java進程的線程轉儲
- 3. 如何分析線程轉儲用於Java服務器進程在Unix中
- 4. 如何分析java線程轉儲?
- 5. 使用jstack進行線程轉儲
- 6. 在線Java線程轉儲分析器
- 7. 分析java線程轉儲
- 8. IIS線程100%,進行轉儲,但不知道如何着手
- 9. 如何在Android進程中獲取正在運行的線程?
- 10. android上的線程轉儲
- 11. 想要在Windows 10中進行線程轉儲?
- 12. 如何進行多線程計算Android
- 13. 有沒有像Java線程轉儲Python的任何線程轉儲方法?
- 14. Shell腳本採取java進程的線程轉儲
- 15. Java進程崩潰 - 需要幫助來分析線程轉儲
- 16. Java進程掛起,不能線程轉儲
- 17. 如何在MATLAB中進行線程化?
- 18. 如何在python中進行線程化?
- 19. 如何在MATLAB中使用JAVA進行顯式多線程?
- 20. 如何在Android中有效地與UI線程進行通信?
- 21. 如何遠程檢索Java線程轉儲
- 22. 如何獲得堆轉儲和線程轉儲爲Tomcat在Mac
- 23. Java線程轉儲中的孤立線程
- 24. 線程轉儲
- 25. 我如何生成jnlp應用程序在java中的線程轉儲
- 26. 在多線程進程中運行存儲過程
- 27. Java線程轉儲摘要工具
- 28. kill -3獲取java線程轉儲
- 29. Java(Solr)線程轉儲有多昂貴?
- 30. 如何在Azure應用服務上執行線程轉儲?
差不多是的。我還沒有知道對象被鎖定了什麼,例如: - 鎖定<0x0000000780b7e688>(a java.io.InputStreamReader) – Divano
由於沒有Eclipse,所以此答案已過時。 –