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
Se si passa alla visualizzazione DDMS in Eclipse si dispone di alcuni strumenti per esaminare i thread. E 'quello che stai cercando?
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
Quasi Sì. Devo ancora sapere qual è l'oggetto bloccato, ad esempio: - bloccato <0x0000000780b7e688> (un java.io.InputStreamReader) – Divano
Eclipse e DDMS sono deprecati e Android Profiler non mostrerà nulla. Leggi sotto per la mia risposta. –
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.
Nota: ho trovato la mia traccia in /data/anr/traces.txt.bugreport –
C'è un modo più semplice, leggi sotto. –
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.
C'è un modo più semplice, leggi la mia risposta qui sotto. –
A volte non è possibile utilizzare i punti di interruzione. Per quei casi usi questo script. –
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.
- 1. Dump thread Python
- 2. Come posso creare un dump di thread tramite JMX?
- 3. Dump thread di Tomcat
- 4. Generare un dump del thread Java senza riavviare.
- 5. Thread Dump Analysis Tool/Metodo
- 6. Quanto sono costosi i dump di thread Java (Solr)?
- 7. Dump thread Java: WAITING (sul monitor oggetti) - cosa sta aspettando?
- 8. kill -3 per ottenere il dump del thread java
- 9. Dump StackTrace per ogni thread in esecuzione
- 10. Come creare più thread utilizzando un loop in java
- 11. Come creare thread in nodejs
- 12. Gestione thread semplice - Java - Android
- 13. Creare un dump dell'heap java da un dump di memoria di Windows
- 14. Dump dell'heap webstart Java
- 15. Creare thread in java per l'esecuzione in background
- 16. Creare core dump su Cygwin
- 17. Equivalente di dump del core per Java
- 18. thread parcheggiato Java
- 19. Quale JVM stampa un dump di thread come questo?
- 20. Analisi file dump del processo Java?
- 21. Java - Come creare un gioco multi-thread utilizzando SwingWorker
- 22. Generazione Mucchio dump Java JRE7
- 23. Come si esegue un dump di thread con MONO?
- 24. Android Come leggere JNI Core Dump Files
- 25. Richiedi java heap dump (core dump) dall'interno dell'applicazione
- 26. Come pianificare thread Java
- 27. Come creare un thread in WinForms?
- 28. Come posso creare i thread del daemon?
- 29. Come convertire un dump dell'heap in Android in formato eclipse
- 30. System.exit in Java Thread
Quasi Sì. Devo ancora sapere quale oggetto è bloccato, ad esempio: - bloccato <0x0000000780b7e688> (un java.io.InputStreamReader) – Divano
Questa risposta è obsoleta poiché non c'è più Eclipse. –