137 votes

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

Dans Android (Java) comment puis-je imprimer une pile complète de trace? Si mon application se bloque à partir de nullPointerException ou quelque chose, il imprime un (presque) complet de la trace de la pile comme suit:

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 connecter un full stack trace de l'endroit où je suis dans le code. J'ai pensé que je pouvais tout simplement faire ceci:

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

Mais cela affiche le pointeur vers l'objet... Dois-je parcourir toutes la trace de la pile d'éléments à imprimer? Ou est-il une méthode simple pour imprimer tous?

172voto

berry120 Points 21945

Ce qui suit devrait faire l'affaire:

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

128voto

Philipp Reichart Points 10371

Toutes les méthodes de journalisation sont remplacées par des signatures (String tag, String msg, Throwable tr) .

Passer une exception en tant que troisième paramètre devrait vous donner le stacktrace complet dans logcat.

11voto

Thomas Points 634

Utilisez Log.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

6voto

Mohsen Afshin Points 3643

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();
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X