2012-11-27 19 views
6

Voglio solo ottenere tutti i dump dai thread della macchina virtuale Java, per vedere cosa i thread bloccano e quali thread in attesa di sbloccare alcune risorse. Qualcosa di simile è descritto here. Ho provato a uccidere il processo Zygote ma senza risultati.Come creare Java Thread Dump in Android?

risposta

-1

Se si passa alla visualizzazione DDMS in Eclipse si dispone di alcuni strumenti per esaminare i thread. E 'quello che stai cercando?

+0

Quasi Sì. Devo ancora sapere quale oggetto è bloccato, ad esempio: - bloccato <0x0000000780b7e688> (un java.io.InputStreamReader) – Divano

+0

Questa risposta è obsoleta poiché non c'è più Eclipse. –

-1

Suppongo che tu abbia bisogno dei thread all'interno di un'app. Per questo, è possibile utilizzare la vista DDMS sul plug-in Eclipse ADT. Ecco il documento http://developer.android.com/tools/debugging/ddms.html#thread

+0

Quasi Sì. Devo ancora sapere qual è l'oggetto bloccato, ad esempio: - bloccato <0x0000000780b7e688> (un java.io.InputStreamReader) – Divano

+0

Eclipse e DDMS sono deprecati e Android Profiler non mostrerà nulla. Leggi sotto per la mia risposta. –

12

Il modo più semplice è con DDMS o con il plugin ADT in Eclipse. Vedi http://developer.android.com/tools/debugging/ddms.html per le istruzioni di base. In breve, vai nella vista Dispositivo, seleziona l'applicazione che ti interessa, assicurati che gli aggiornamenti dei thread siano abilitati e passa alla visualizzazione Thread. Otterrai un elenco aggiornato di thread in questo processo. Fare doppio clic su un thread catturerà un'istantanea dello stato attuale dello stack.

È possibile utilizzare select-all e copiare nel thread dump per copiare & incollare la traccia dello stack.

Se si dispone di un dispositivo sviluppatore/radicata, si può chiedere la VM Dalvik per eseguire il dump stack di thread con l'invio di un SIGQUIT al processo di applicazione che ti interessa. Per esempio, se si voleva vedere gli stack per tutte le discussioni in applicazione Calendario, si potrebbe fare qualcosa di simile:

% 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 

l'uscita logcat dirà qualcosa del tipo:

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

Quindi, tirare che:

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

Ogni volta che si segnala un processo, i registri vengono aggiunti a quel file. Ci possono essere altre cose in là, quindi è necessario cercare pid 2596:

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

DALVIK THREADS: 
... 

Il vantaggio di fare questo sopra la vista filo DDMS è che, se il filo è bloccato su un monitor, il dump dello stack darà tu un'indicazione di quale oggetto è bloccato e quale thread attualmente detiene il blocco.

Il processo di zigote non è rilevante qui; per definizione non è in esecuzione un'app. Dal momento che non ha un thread JDWP e non ascolta SIGQUIT, non è possibile ottenere comunque una traccia stack.

+0

Nota: ho trovato la mia traccia in /data/anr/traces.txt.bugreport –

+0

C'è un modo più semplice, leggi sotto. –

1

Prendendo i comandi dallo answer e mettendo tutto insieme, ecco lo script seguente. Inserendolo nel file dump.sh ed eseguendolo, troverà il PID necessario, creerà un nuovo file con il timestamp corrente e successivamente recupererà il Thread-Dump in esso. Questo comando può essere utile quando si ha un periodo di tempo molto breve per recuperare il dump. Prima di utilizzarlo, assicurarsi che le tracce siano inserite nel file /data/anr/traces.txt o sostituire questo valore nello script.

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

Come un nome di file alternativo, si può usare per ottenere f=$(date +"%T.%6N") timestamp leggibile. Sarebbe più facile trovare il file necessario.

+0

C'è un modo più semplice, leggi la mia risposta qui sotto. –

+0

A volte non è possibile utilizzare i punti di interruzione. Per quei casi usi questo script. –

0

Basta eseguire il debug della tua app sul telefono in Android Studio; quindi nella "Vista di debug" Alt+5 basta premere il pulsante "Fotocamera" nell'angolo in basso a sinistra, per ottenere un dump di tutti gli stacktraces, inclusi i blocchi in loro possesso.