Scrivere e visualizzare i log con Logcat

La finestra Logcat in Android Studio visualizza i messaggi di sistema, come quando si verifica una raccolta di garbag, e i messaggi che hai aggiunto alla tua app con la classe Log. Visualizza i messaggi in tempo reale e mantiene una cronologia in modo da poter visualizzare i messaggi più vecchi.

Per visualizzare solo le informazioni di interesse, è possibile creare filtri, modificare la quantità di informazioni visualizzate nei messaggi, impostare livelli di priorità, visualizzare solo i messaggi prodotti dal codice dell’applicazione e cercare nel log. Per impostazione predefinita, logcat mostra solo l’output del log relativo all’applicazione eseguita più di recente.

Quando un’applicazione lancia un’eccezione, logcat mostra un messaggio seguito dalla traccia dello stack associata contenente collegamenti alla linea di codice.

A partire da Android Studio 2.2, la finestra Esegui mostra anche i messaggi di log per l’applicazione in esecuzione. Nota che puoi configurare la visualizzazione dell’output di logcat, ma non la finestra di esecuzione.

Visualizza i log della tua app

Per visualizzare i messaggi di log di un’app:

  1. Costruisci ed esegui la tua app su un dispositivo.
  2. Clicca su View > Tool Windows > Logcat (o clicca su Logcat nella barra della finestra degli strumenti).

La finestra Logcat mostra i messaggi di log per l’applicazione selezionata, come selezionato dagli elenchi a discesa nella parte superiore della finestra, come mostrato in figura 1.

Figura 1. Finestra Logcat

Per impostazione predefinita, logcat visualizza solo i messaggi di log per la tua app in esecuzione sul dispositivo. Per cambiare questo default, vedi come filtrare i messaggi logcat.

La barra degli strumenti Logcat fornisce i seguenti pulsanti:

  1. Cancella logcat : Clicca per cancellare il log visibile.
  2. Scorri alla fine : Clicca per saltare in fondo al log e vedere gli ultimi messaggi di log. Se poi fai clic su una riga del log, la visualizzazione si ferma a quel punto.
  3. Su la traccia dello stack e Giù la traccia dello stack : Cliccate per navigare su e giù per le tracce dello stack nel log, selezionando i successivi nomi di file (e visualizzando i corrispondenti numeri di linea nell’editor) che appaiono nelle eccezioni stampate. Questo è lo stesso comportamento di quando si clicca su un nome di file nel log.
  4. Usa soft wraps : Fare clic per abilitare il line wrapping e prevenire lo scorrimento orizzontale (anche se qualsiasi stringa infrangibile richiederà comunque lo scorrimento orizzontale).
  5. Print : Fare clic per stampare i messaggi logcat. Dopo aver selezionato le tue preferenze di stampa nella finestra di dialogo che appare, puoi anche scegliere di salvare in un PDF.
  6. Restart : Fare clic per cancellare il registro e riavviare logcat. A differenza del pulsante Clear logcat, questo recupera e visualizza i messaggi di log precedenti, quindi è molto utile se Logcat non risponde e non vuoi perdere i messaggi di log.
  7. Intestazione Logcat : Fare clic per aprire la finestra di dialogo Configure Logcat Header, dove è possibile personalizzare l’aspetto di ogni messaggio logcat, ad esempio se mostrare la data e l’ora.
  8. Screen capture : Fare clic per catturare uno screenshot.
  9. Registrazione schermo : Clicca per registrare un video del dispositivo (per un massimo di 3 minuti).

Scrivi messaggi di log

La classe Log ti permette di creare messaggi di log che appaiono in logcat. Generalmente, dovresti usare i seguenti metodi di log, elencati in ordine dalla priorità più alta alla più bassa (o dalla meno alla più prolissa):

  • Log.e(String, String) (error)
  • Log.w(String, String) (warning)
  • Log.i(String, String) (information)
  • Log.d(String, String) (debug)
  • Log.v(String, String) (verbose)

Vedi la descrizione della classe Log per una lista più completa di opzioni.

Non dovresti mai compilare i log verbosi nella tua applicazione, eccetto durante lo sviluppo. I log di debug sono compilati ma rimossi in fase di esecuzione, mentre i log di errore, avviso e informazione sono sempre conservati.

Per ogni metodo di log, il primo parametro dovrebbe essere un tag unico e il secondo parametro è il messaggio. Il tag di un messaggio di log di sistema è una breve stringa che indica il componente di sistema da cui proviene il messaggio (per esempio, ActivityManager). Il vostro tag può essere qualsiasi stringa che trovate utile, come il nome della classe corrente.

Una buona convenzione è dichiarare una costante TAG nella vostra classe da usare nel primo parametro. Per esempio, potresti creare un messaggio di log informativo come segue:

Kotlin

private const val TAG = "MyActivity"...Log.i(TAG, "MyClass.getView() — get item number $position")

Java

private static final String TAG = "MyActivity";...Log.i(TAG, "MyClass.getView() — get item number " + position);

Nota: i nomi dei tag maggiori di 23 caratteri vengono troncati nell’output di logcat.

Formato dei messaggi logcat

Ogni messaggio di log Android ha un tag e una priorità associati. Il tag di un messaggio di log di sistema è una breve stringa che indica il componente di sistema da cui proviene il messaggio (per esempio, ActivityManager). Un tag definito dall’utente può essere qualsiasi stringa che trovi utile, come il nome della classe corrente (il tag consigliato). Lo definisci in una chiamata di metodo Log, per esempio:

Kotlin

Log.d(tag, message)

Java

Log.d(tag, message);

La priorità è uno dei seguenti valori:

  • V: Verbose (priorità più bassa)
  • D: Debug
  • I: Info
  • W: Warning
  • E: Error
  • A: Assert

Il formato del messaggio di log è:

date time PID-TID/package priority/tag: message

Per esempio, il seguente messaggio di log ha una priorità di V e un tag di AuthZen:

12-10 13:02:50.071 1901-4229/com.google.android.gms V/AuthZen: Handling delegate intent.

PID sta per process identifier e TID è thread identifier; possono essere uguali se c’è un solo thread.

Imposta il livello di log

Puoi controllare quanti messaggi appaiono in logcat impostando il livello di log. Puoi visualizzare tutti i messaggi o solo quelli che indicano le condizioni più gravi.

Ricorda che logcat continua a raccogliere tutti i messaggi indipendentemente dall’impostazione del livello di log. L’impostazione determina solo ciò che logcat visualizza.

Nel menu Log level, seleziona uno dei seguenti valori:

  • Verboso: Mostra tutti i messaggi di log (il valore predefinito).
  • Debug: Mostra i messaggi di log di debug che sono utili solo durante lo sviluppo, così come i livelli di messaggio inferiori in questa lista.
  • Info: Mostra i messaggi di log previsti per l’uso regolare, così come i livelli di messaggio più bassi in questa lista.
  • Warn: Mostra possibili problemi che non sono ancora errori, così come i livelli di messaggio più bassi in questa lista.
  • Errore: Mostra i problemi che hanno causato errori, così come il livello di messaggio più basso in questa lista.
  • Assert: Mostra i problemi che lo sviluppatore si aspetta non debbano mai accadere.

Ricerca messaggi logcat

Per cercare i messaggi attualmente visualizzati in logcat:

  1. Opzionalmente seleziona Regex se vuoi usare un modello di ricerca con espressione regolare.
  2. Digita una sequenza di caratteri nel campo di ricerca .

    La visualizzazione dell’output di logcat cambia di conseguenza.

  3. Premete Invio per memorizzare la stringa di ricerca nel menu durante questa sessione.
  4. Per ripetere una ricerca, sceglietela dal menu di ricerca. Seleziona o deseleziona Regex secondo necessità (l’impostazione non viene ricordata).

Filtra i messaggi di logcat

Un modo per ridurre l’output del log ad un livello gestibile è quello di limitarlo usando un filtro.

Nota: il filtro si applica a tutta la cronologia di logcat, non solo ai messaggi attualmente visualizzati in logcat. Assicurati che le altre opzioni di visualizzazione siano impostate correttamente in modo da poter vedere l’output del filtro che vuoi esaminare.

Per definire e applicare un filtro:

  1. Nel menu dei filtri, seleziona un’opzione di filtro:
    • Mostra solo l’applicazione selezionata: Visualizza solo i messaggi prodotti dal codice dell’applicazione (il default). Logcat filtra i messaggi di log usando il PID dell’applicazione attiva.
    • Nessun filtro: Non applica alcun filtro. Logcat visualizza tutti i messaggi di log dal dispositivo, indipendentemente dal processo selezionato.
    • Modifica configurazione filtro: Crea o modifica un filtro personalizzato. Ad esempio, è possibile creare un filtro per visualizzare i messaggi di log da due applicazioni allo stesso tempo.

    Dopo aver definito i filtri, puoi anche selezionarli nel menu. Per rimuoverli dal menu, cancellali.

  2. Se hai selezionato Modifica configurazione filtro, crea o modifica un filtro:
    1. Specifica i parametri del filtro nella finestra di dialogo Crea nuovo filtro Logcat:
      • Nome del filtro: Digita il nome di un filtro che vuoi definire, o selezionalo nel pannello di sinistra per modificare un filtro esistente. Il nome può contenere solo caratteri minuscoli, trattini bassi e cifre.
      • Log Tag: Specifica opzionalmente un tag. Per maggiori informazioni, vedi logcat Message Format.
      • Messaggio di log: Specifica opzionalmente il testo del messaggio di log. Per maggiori informazioni, vedi logcat Message Format.
      • Nome pacchetto: Specificare facoltativamente il nome di un pacchetto. Per maggiori informazioni, vedi logcat Message Format.
      • PID: Specifica opzionalmente un ID di processo. Per maggiori informazioni, vedi logcat Message Format.
      • Livello di log: Facoltativamente seleziona un livello di log. Per maggiori informazioni, vedere Impostare il livello di log.
      • Regex: Selezionare questa opzione per utilizzare la sintassi delle espressioni regolari per quel parametro.
    2. Fai clic su + per aggiungere la definizione del filtro al pannello sinistro.

      Per rimuovere un filtro, selezionalo nel pannello di sinistra e clicca su -.

    3. Quando hai finito, clicca su OK.

Se pensi di non vedere i messaggi di log che vuoi, prova a selezionare Nessun filtro e cerca particolari messaggi di log.

Leggi messaggi di garbage collection

A volte quando si verifica un evento di garbage collection, vengono stampati su logcat.

Per maggiori dettagli sulla memoria della tua applicazione, usa ilMemory Profiler.

Messaggi di log di Dalvik

In Dalvik (ma non ART), ogni GC stampa le seguenti informazioni su logcat:

D/dalvikvm(PID): GC_Reason Amount_freed, Heap_stats, External_memory_stats, Pause_time

Esempio:

D/dalvikvm( 9050): GC_CONCURRENT freed 2049K, 65% free 3571K/9991K, external 4703K/5261K, paused 2ms+2ms

GC Reason Cosa ha innescato il GC e che tipo di raccolta è. I motivi che potrebbero apparire includono:GC_CONCURRENTUn GC concorrente che libera la memoria mentre l’heap comincia a riempirsi.GC_FOR_MALLOCUn GC è stato causato perché la vostra applicazione ha tentato di allocare memoria quando il vostro heap era già pieno, così il sistema ha dovuto fermare la vostra applicazione e recuperare la memoria.GC_HPROF_DUMP_HEAPUn GC che si verifica quando richiedi di creare un file HPROF per analizzare il tuo heap.GC_EXPLICITUn GC esplicito, come quando chiamategc()(che dovreste evitare di chiamare e fidarvi invece che il GC venga eseguito quando necessario).GC_EXTERNAL_ALLOCQuesto accade solo su API livello 10 e inferiori (le versioni più recenti allocano tutto nel Dalvikheap). Un GC per la memoria allocata esternamente (come i dati dei pixel memorizzati nella memoria interna o i buffer di byte NIO). Amount freed La quantità di memoria recuperata da questo GC. Heap stats Percentuale libera dell’heap e (numero di oggetti live)/(dimensione totale dell’heap). Statistiche memoria esterna Memoria allocata esternamente a livello API 10 e inferiore (quantità di memoria allocata) / (limite al quale avverrà la raccolta). Tempo di pausa Gli heap più grandi avranno tempi di pausa più grandi. I tempi di pausa concomitanti mostrano due pause: una all’inizio della raccolta e un’altra verso la fine.

Mentre questi messaggi di log si accumulano, cerca aumenti nelle statistiche di heap (il valore 3571K/9991K nell’esempio precedente). Se questo valore continua ad aumentare, potresti avere una perdita di memoria.

Messaggi di log di ART

A differenza di Dalvik, ART non registra messaggi per GC che non sono stati esplicitamente richiesti. I GC vengono stampati solo quando sono considerati lenti. Più precisamente, se la pausa GC supera i 5ms o la durata GC supera i 100ms. Se l’app non è in uno stato di pausa percepibile (come quando l’app è in background, dove l’utente non può percepire una pausa GC), allora nessuno dei suoi GC è considerato lento. I GC espliciti sono sempre registrati.

ART include le seguenti informazioni nei suoi messaggi di log della garbage collection:

I/art: GC_Reason GC_Name Objects_freed(Size_freed) AllocSpace Objects, Large_objects_freed(Large_object_size_freed) Heap_stats LOS objects, Pause_time(s)

Esempio:

I/art : Explicit concurrent mark sweep GC freed 104710(7MB) AllocSpace objects, 21(416KB) LOS objects, 33% free, 25MB/38MB, paused 1.230ms total 67.216ms

GC Reason Cosa ha innescato il GC e che tipo di raccolta è. I motivi che potrebbero apparire includono:ConcurrentUn GC concorrente che non sospende i thread dell’applicazione. Questo GC viene eseguito in un thread in background e non impedisce le allocazioni.AllocIl GC è stato avviato perché la vostra applicazione ha tentato di allocare memoria quando il vostro heap era già pieno. In questo caso, la garbage collection è avvenuta nel thread di allocazione.ExplicitLa garbage collection è stata esplicitamente richiesta da un’applicazione, per esempio, chiamandogc()ogc(). Come Dalvik, in ART la pratica migliore è fidarsi del GC ed evitare di richiedere GC espliciti, se possibile. I GC espliciti sono scoraggiati perché bloccano il thread di allocazione e sprecano inutilmente cicli di CPU. I GC espliciti potrebbero anche causare jank (stuttering, juddering o halting nell’applicazione) se causano il preempimento di altri thread.NativeAllocLa raccolta era causata dalla pressione della memoria nativa da allocazioni native come Bitmap o oggetti di allocazione RenderScript.CollectorTransitionLa raccolta è stata causata da una transizione dell’heap; questa è causata dal cambiamento della strategia GC in fase di esecuzione (come quando l’applicazione cambia tra stati di pausa). Le transizioni del collettore consistono nel copiare tutti gli oggetti da uno spazio appoggiato su una lista libera a uno spazio con puntatore a urto (o viceversa).

Questo si verifica solo su dispositivi a bassa RAM prima di Android 8.0quando un’app cambia stato di processo da uno stato percettibile di pausa (come quando l’app è in primo piano, dove l’utente può percepire una pausa GC) a uno stato non percettibile di pausa (o viceversa).

HomogeneousSpaceCompactLa compattazione dello spazio omogeneo è la compattazione da spazio free-list a spazio free-list che solitamente avviene quando un’app viene spostata in uno stato di processo impercettibile di pausa. Le ragioni principali per farlo sono la riduzione dell’uso della RAM e la deframmentazione dell’heap.DisableMovingGcQuesto non è un vero motivo GC, ma una nota che la raccolta è stata bloccata a causa dell’uso diGetPrimitiveArrayCritical. mentre la compattazione dell’heap concomitante sta avvenendo. In generale, l’uso diGetPrimitiveArrayCritical è fortemente scoraggiato a causa delle sue restrizioni sullo spostamento dei collettori.HeapTrimQuesto non è un motivo GC, ma una nota che la raccolta è stata bloccata fino a quando un assetto dell’heap non è finito. GC Name ART ha vari GC diversi che possono essere eseguiti.Concurrent mark sweep (CMS)Un raccoglitore di heap intero che libera tutti gli spazi diversi dallo spazio immagine.Concurrent partial mark sweepUn raccoglitore di heap prevalentemente intero che raccoglie tutti gli spazi diversi da quelli dell’immagine e dello zigote.Concurrent sticky mark sweepUn raccoglitore generazionale che può liberare solo gli oggetti allocati dall’ultimo GC. Questo garbagecollection viene eseguito più spesso di un mark sweep completo o parziale poiché è più veloce e ha meno pause.Marksweep + semispaceUn GC non concorrente e copiativo usato per le transizioni di heap e per la compattazione omogenea dello spazio (per deframmentare l’heap). Oggetti liberati Il numero di oggetti che sono stati recuperati da questo GC dallo spazio degli oggetti non grandi. Dimensione liberata Il numero di byte che sono stati recuperati da questo GC dallo spazio oggetti non grande. Oggetti grandi liberati Il numero di oggetti nello spazio degli oggetti grandi che sono stati recuperati da questa garbagecollection. Dimensione degli oggetti grandi liberati Il numero di byte nello spazio degli oggetti grandi che sono stati recuperati da questa collezione di garbag. Heap stats Percentuale di oggetti liberi e (numero di oggetti vivi)/(dimensione totale dell’heap). Tempi di pausa In generale i tempi di pausa sono proporzionali al numero di riferimenti agli oggetti che sono stati modificati mentre il GC era in esecuzione. Attualmente, i GC ART CMS hanno solo una pausa, verso la fine del GC. I GC in movimento hanno una lunga pausa che dura per la maggior parte della durata del GC.

Se stai vedendo una grande quantità di GC in logcat, cerca aumenti nelle statistiche dell’heap (il valore25MB/38MB nell’esempio precedente). Se questo valore continua ad aumentare e non sembra mai diminuire, potreste avere una perdita di memoria. In alternativa, se state vedendo GC che sono per il motivo “Alloc”, allora state già operando vicino alla vostra capacità di heap e potete aspettarvi eccezioniOOM nel prossimo futuro.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.