Android: stampa il backtrace completo delle eccezioni nel registro


94

Ho un blocco try / catch che genera un'eccezione e vorrei visualizzare le informazioni sull'eccezione nel registro del dispositivo Android.

Ho letto il log del dispositivo mobile con questo comando dal mio computer di sviluppo:

/home/dan/android-sdk-linux_x86/tools/adb shell logcat

Ho provato prima questo:

try {
    // code buggy code
} catch (Exception e)
{
    e.printStackTrace();
}

ma ciò non stampa nulla nel registro. È un peccato perché avrebbe aiutato molto.

Il meglio che ho ottenuto è:

try {
    // code buggy code
} catch (Exception e)
{
    Log.e("MYAPP", "exception: " + e.getMessage());             
    Log.e("MYAPP", "exception: " + e.toString());
}

Meglio di niente ma non molto soddisfacente.

Sai come stampare il backtrace completo sul registro?

Grazie.

Risposte:


165
try {
    // code that might throw an exception
} catch (Exception e) {
    Log.e("MYAPP", "exception", e);
}

Più esplicitamente con ulteriori informazioni

(Poiché questa è la domanda più vecchia al riguardo.)

I metodi di log Android a tre argomenti stamperanno la traccia dello stack per un Exceptiondato fornito come terzo parametro. Per esempio

Log.d(String tag, String msg, Throwable tr)

dov'è trl'eccezione.

Secondo questo commento quei metodi Log "usano il getStackTraceString()metodo ... dietro le quinte" per farlo.


4
Inoltre, il mio stile: Log.e (e.getClass (). GetName (), e.getMessage (), e);
Vikas

27
Attenzione all'uso di e.getMessage () - getMessage () potrebbe restituire null, a seconda del tipo di eccezione che è stata generata, il che di per sé causerebbe un'eccezione poiché null non è supportato come parametro di messaggio nei metodi Log. Vedi qui
Uniqe

Inoltre, ha più senso descrivere quale tipo di codice ha causato questa eccezione nel secondo parametro. Il messaggio è comunque già incluso nell'output.
EboMike

1
Quello che dice @Unique è molto importante. È meglio usare Log come menzionato nella risposta poiché stampa già la traccia dello stack
Buddy

1
@SignoffTeamz Potresti semplicemente leggere la documentazione. È un identificatore che mostra il registro che rende più facile filtrare il registro e vedere quale app (e quale parte di esso) ha scritto il messaggio. developer.android.com/reference/android/util/… , java.lang.String, java.lang.Throwable)
EboMike

52

Anche questa funzione di aiuto funziona bene poiché anche l' eccezione è lanciabile .

    try{
        //bugtastic code here
    }
    catch (Exception e)
    {
         Log.e(TAG, "Exception: "+Log.getStackTraceString(e));
    }

È una stringa utilizzata per specificare l'app e la posizione. Qualsiasi stringa andrà bene lì.
George

8
catch (Exception e) {
  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  PrintStream stream = new PrintStream( baos );
  e.printStackTrace(stream);
  stream.flush();
  Log.e("MYAPP", new String( baos.toByteArray() );
}

O ... sai ... cosa ha detto EboMike.


3
public String getStackTrace(Exception e){
  StringWriter sw = new StringWriter();
  PrintWriter pw = new PrintWriter(sw);
  e.printStackTrace(pw);
  return sw.toString();
}

2

e.printStackTrace () me lo stampa. Non penso che tu stia eseguendo correttamente il logcat. Non eseguirlo in una shell, corri e basta

/home/dan/android-sdk-linux_x86/tools/adb logcat


1

L'output standard e l'output degli errori sono diretti a / dev / null per impostazione predefinita, quindi è tutto perso. Se vuoi registrare questo output, devi seguire le istruzioni "Visualizzazione di stdout e stderr" mostrate qui


1
try{
            ...
} catch (Exception e) {
     Log.e(e.getClass().getName(), e.getMessage(), e.getCause());
}

0

Nel contesto di Android, ho dovuto eseguire il cast dell'eccezione su una stringa:

try {
    url = new URL(REGISTRATION_PATH);
    urlConnection = (HttpURLConnection) url.openConnection();
} catch(MalformedURLException e) {
    Log.i("MALFORMED URL", String.valueOf(e));
} catch(IOException e) {
    Log.i("IOException", String.valueOf(e));
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.