2012-11-27 5 views
6

Ich möchte nur alle Dumps von Java VM-Threads erhalten, um zu sehen, was die Threads sperren und welche Threads darauf warten, einige Ressourcen zu entsperren. So etwas ist beschrieben here. Ich habe versucht, Zygote-Prozess zu töten, aber ohne Ergebnisse.Wie mache ich Java Thread Dump in Android?

Antwort

-1

Wenn Sie in Eclipse zur DDMS-Ansicht wechseln, haben Sie einige Werkzeuge, um sich Threads anzusehen. Ist das wonach Sie suchen?

+0

Fast Ja. Ich muss noch wissen, was das Objekt gesperrt ist, zum Beispiel: - gesperrt <0x0000000780b7e688> (ein java.io.InputStreamReader) – Divano

+0

Diese Antwort ist veraltet, da es kein Eclipse mehr gibt. –

-1

Ich vermute, Sie brauchen die Threads innerhalb einer App. Dazu können Sie die DDMS-Ansicht auf dem ADT Eclipse-Plugin verwenden. Hier ist das Dokument http://developer.android.com/tools/debugging/ddms.html#thread

+0

Fast Ja. Ich muss noch wissen, was das Objekt gesperrt ist, zum Beispiel: - gesperrt <0x0000000780b7e688> (ein java.io.InputStreamReader) – Divano

+0

Eclipse und DDMS sind veraltet, und Android Profiler wird nichts anzeigen. Lesen Sie weiter unten für meine Antwort. –

12

Der einfachste Weg ist mit DDMS, oder das ADT-Plugin in Eclipse. Eine grundlegende Anleitung finden Sie unter http://developer.android.com/tools/debugging/ddms.html. Kurz gesagt, gehen Sie in die Geräteansicht, wählen Sie die Anwendung aus, an der Sie interessiert sind, stellen Sie sicher, dass die Thread-Updates aktiviert sind, und wechseln Sie zur Ansicht Threads. Sie erhalten eine live-aktualisierte Liste von Threads in diesem Prozess. Durch Doppelklicken auf einen Thread wird ein Snapshot des aktuellen Stack-Status erstellt.

Sie können wählen Sie alle und kopieren Sie in den Thread-Dump zu kopieren & fügen Sie den Stack-Trace.

Wenn Sie ein Entwickler-/Root-Gerät haben, können Sie die Dalvik-VM bitten, Thread-Stacks zu löschen, indem Sie eine SIGQUIT an den gewünschten App-Prozess senden. Zum Beispiel, wenn Sie die Stacks für alle Threads sehen möchten in der Kalender-App, können Sie etwas tun:

% 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 

die logcat Ausgang sagen etwas wie:

I/dalvikvm(2596): Wrote stack traces to '/data/anr/traces.txt' 

Also, ziehen Sie das:

% adb pull /data/anr/traces.txt . 

Jedes Mal, wenn Sie einen Prozess signalisieren, werden die Protokolle an diese Datei angehängt. Es können auch andere Sachen da sein in, so müssen Sie für pid 2596 suchen:

----- pid 2596 at 2012-11-27 12:48:38 ----- 
Cmd line: com.google.android.calendar 

DALVIK THREADS: 
... 

Der Vorteil dabei über die DDMS Thread-Ansicht ist, dass, wenn der Faden auf einem Monitor stecken, wird der Stack Dump geben Sie zeigen an, welches Objekt gesperrt ist und welcher Thread gerade die Sperre hält.

Der Zygote-Prozess ist hier nicht relevant; Per Definition wird keine App ausgeführt. Da es keinen JDWP-Thread hat und nicht auf SIGQUIT wartet, können Sie trotzdem keinen Stack-Trace herausholen.

+0

Hinweis: Ich habe meinen Trace unter /data/anr/traces.txt.bugreport gefunden –

+0

Es gibt einen einfacheren Weg, lesen Sie weiter unten. –

1

Nehmen Sie die Befehle von der answer, und alles zusammen, hier ist das folgende Skript. Wenn Sie es in die dump.sh-Datei einfügen und ausführen, wird es die benötigte PID finden, eine neue Datei mit dem aktuellen Zeitstempel erstellen und als nächstes wird der Thread-Dump dorthin geladen. Dieser Befehl kann nützlich sein, wenn eine sehr kurze Zeit zum Abrufen des Speicherauszugs benötigt wird. Stellen Sie vor der Verwendung sicher, dass Ablaufverfolgungen in die Datei /data/anr/traces.txt eingegeben werden, oder ersetzen Sie diesen Wert im Skript.

#!/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 

Als Alternative Dateinamen kann man f=$(date +"%T.%6N") verwenden Menschen lesbaren Zeitstempel zu erhalten. Es wäre einfacher, die benötigte Datei zu finden.

+0

Es gibt einen einfacheren Weg, lies meine Antwort unten. –

+0

Manchmal können Sie keine Haltepunkte verwenden. In diesen Fällen verwenden Sie dieses Skript. –

0

Debuggen Sie einfach Ihre App auf Ihrem Telefon in Android Studio; dann in der "Debug-Ansicht" Alt+5 drücken Sie einfach die "Kamera" -Taste in der unteren linken Ecke, um einen Dump aller Stacktraces zu erhalten, einschließlich der Sperren, die sie halten.

Verwandte Themen