Java / Android - Comment imprimer une trace de pile complète?


Dans Android (Java) comment imprimer une trace de pile complète? Si mon application se bloque à partir de NullPointerException ou quelque chose, elle imprime une trace de pile (presque) complète comme ceci:

java.io.IOException: Attempted read from closed stream.
com.android.music.sync.common.SoftSyncException: java.io.IOException: Attempted read from closed stream.
    at com.android.music.sync.google.MusicSyncAdapter.getChangesFromServerAsDom(MusicSyncAdapter.java:545)
    at com.android.music.sync.google.MusicSyncAdapter.fetchDataFromServer(MusicSyncAdapter.java:488)
    at com.android.music.sync.common.AbstractSyncAdapter.download(AbstractSyncAdapter.java:417)
    at com.android.music.sync.common.AbstractSyncAdapter.innerPerformSync(AbstractSyncAdapter.java:313)
    at com.android.music.sync.common.AbstractSyncAdapter.onPerformLoggedSync(AbstractSyncAdapter.java:243)
    at com.google.android.common.LoggingThreadedSyncAdapter.onPerformSync(LoggingThreadedSyncAdapter.java:33)
    at android.content.AbstractThreadedSyncAdapter$SyncThread.run(AbstractThreadedSyncAdapter.java:164)
Caused by: java.io.IOException: Attempted read from closed stream.
    at org.apache.http.impl.io.ChunkedInputStream.read(ChunkedInputStream.java:148)
    at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:159)
    at java.util.zip.GZIPInputStream.readFully(GZIPInputStream.java:212)
    at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:81)
    at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:64)
    at android.net.http.AndroidHttpClient.getUngzippedContent(AndroidHttpClient.java:218)
    at com.android.music.sync.api.MusicApiClientImpl.createAndExecuteMethod(MusicApiClientImpl.java:312)
    at com.android.music.sync.api.MusicApiClientImpl.getItems(MusicApiClientImpl.java:588)
    at com.android.music.sync.api.MusicApiClientImpl.getTracks(MusicApiClientImpl.java:638)
    at com.android.music.sync.google.MusicSyncAdapter.getChangesFromServerAsDom(MusicSyncAdapter.java:512)
    ... 6 more

Cependant, parfois, à des fins de débogage, je veux enregistrer une trace de pile complète à partir de l'endroit où je suis dans le code. J'ai pensé que je pouvais juste faire ceci:

StackTraceElement trace = new Exception().getStackTrace();
Log.d("myapp", trace.toString());

Mais cela imprime simplement le pointeur sur l'objet... Dois-je parcourir tous les oligo-éléments de la pile pour les imprimer? Ou est-il une méthode simple pour imprimer tout?

Author: Jake Wilson, 2011-10-20

7 answers

Il y a des remplacements de toutes les méthodes de log avec des signatures (String tag, String msg, Throwable tr).

Passer une exception en tant que troisième paramètre devrait vous donner la pile complète dans logcat.

 101
Author: Philipp Reichart, 2011-10-20 19:40:06

Ce qui suit devrait faire l'affaire:

Log.d("myapp", Log.getStackTraceString(new Exception()));

Remarque que ...x more à la fin ne coupez pas toutes les informations de la trace de la pile:

(Cela indique) que le reste de la trace de pile pour cette exception correspond au nombre de trames indiqué à partir du bas de la trace de pile de l'exception qui a été causée par cette exception (l'exception "englobante").

...ou en d'autres termes, remplacez {[2] } par les dernières lignes x de la première exception.

 124
Author: Michael Berry, 2018-07-02 14:26:24

Utiliser le journal.getStackTraceString (Throwable t). Vous pouvez obtenir des traces de pile plus longues en creusant plus profondément. Par exemple:

try {
    ...
} catch(Exception e) {
    Log.d("Some tag", Log.getStackTraceString(e.getCause().getCause()));
}

Retiré de http://developer.android.com/reference/android/util/Log.html#getStackTraceString%28java.lang.Throwable%29

 9
Author: Thomas, 2013-12-19 22:02:39
private static String buildStackTraceString(final StackTraceElement[] elements) {
    StringBuilder sb = new StringBuilder();
    if (elements != null && elements.length > 0) {
        for (StackTraceElement element : elements) {
            sb.append(element.toString());
        }
    }
    return sb.toString();
}


// call this at your check point
Log.d(TAG, buildStackTraceString(Thread.currentThread().getStackTrace()));
 8
Author: faywong, 2017-07-04 18:52:18

Vous pouvez utiliser ceci:

public static String toString(StackTraceElement[] stackTraceElements) {
    if (stackTraceElements == null)
        return "";
    StringBuilder stringBuilder = new StringBuilder();
    for (StackTraceElement element : stackTraceElements)
        stringBuilder.append(element.toString()).append("\n");
    return stringBuilder.toString();
}
 5
Author: Mohsen Afshin, 2013-08-31 13:00:27

Vous pouvez également imprimer une trace de pile à n'importe quel point du code de votre application en utilisant des méthodes telles que Thread.dumpStack()

Veuillez passer par le lien pour plus de détails

 2
Author: ajaykoppisetty, 2018-04-13 11:06:06

Vous devez utiliser Throwable Object pour obtenir la pile complète.

try{
 // code here
}catch(Exception e){
    String exception = getStackTrace(e);
}

public static String getStackTrace(final Throwable throwable) {
     final StringWriter sw = new StringWriter();
     final PrintWriter pw = new PrintWriter(sw, true);
     throwable.printStackTrace(pw);
     return sw.getBuffer().toString();
}

Ref: https://stackoverflow.com/a/18546861

 0
Author: Houssin Boulla, 2018-02-07 11:44:08