it-swarm.com.de

Java/Android - So drucken Sie eine vollständige Stapelverfolgung aus

Wie drucke ich unter Android (Java) eine vollständige Stapelverfolgung aus? Wenn meine Anwendung von nullPointerException oder etwas abstürzt, wird eine (fast) vollständige Stapelablaufverfolgung wie folgt ausgegeben:

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

Manchmal möchte ich jedoch zu Debugging-Zwecken eine vollständige Stack-Ablaufverfolgung von der Stelle im Code aus protokollieren. Ich dachte, ich könnte das einfach tun:

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

Dies gibt jedoch nur den Zeiger auf das Objekt aus. Muss ich alle Stack-Trace-Elemente durchlaufen, um sie auszudrucken? Oder gibt es eine einfache Methode, um alles auszudrucken?

111
Jake Wilson

Es gibt Überschreibungen aller log-Methoden mit (String tag, String msg, Throwable tr)-Signaturen.

Wenn Sie eine Ausnahme als third -Parameter übergeben, erhalten Sie den vollständigen Stacktrace in logcat.

105

Folgendes sollte den Trick tun:

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

Beachten Sie, dass ...x more am Ende keine Informationen aus dem Stack-Trace abschneidet:

(Dies zeigt an), dass der Rest der Stack-Ablaufverfolgung für diese Ausnahme mit der angegebenen Anzahl von Frames vom unteren Rand der Stack-Ablaufverfolgung der Ausnahme übereinstimmt, die durch diese Ausnahme verursacht wurde (die Ausnahme "einschließend").

... oder mit anderen Worten, x more durch die letzten x-Zeilen der ersten Ausnahme ersetzen.

131
Michael Berry

Verwenden Sie Log.getStackTraceString (Throwable t). Sie können längere Stapelspuren erhalten, wenn Sie tiefer graben. Zum Beispiel:

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

Aus http://developer.Android.com/reference/Android/util/Log.html#getStackTraceString%28Java.lang.Throwable%29

9
Thomas
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
faywong

Sie können dies verwenden:

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
Mohsen Afshin

Sie können eine Stapelablaufverfolgung an jedem Punkt in Ihrem App-Code mit Methoden wie Thread.dumpStack() drucken. 

Bitte gehen Sie durch den Link für mehr Details

2
ajaykoppisetty

Sie müssen Throwable Object verwenden, um das vollständige stackTrace zu erhalten.

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
Houssin Boulla