it-swarm-id.com

Java/Android - Bagaimana cara mencetak jejak tumpukan penuh?

Di Android (Jawa) bagaimana cara mencetak jejak tumpukan penuh? Jika aplikasi saya macet dari nullPointerException atau sesuatu, itu mencetak jejak stack penuh (hampir) seperti:

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

Namun terkadang, untuk keperluan debugging, saya ingin mencatat jejak stack penuh dari tempat saya berada dalam kode. Saya pikir saya bisa melakukan ini:

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

Tapi ini hanya mencetak pointer ke objek ... Apakah saya harus mengulangi semua elemen stack stack untuk mencetaknya? Atau adakah metode sederhana untuk mencetak semuanya?

111
Jake Wilson

Ada penggantian semua metode log dengan tanda tangan (String tag, String msg, Throwable tr).

Melewati pengecualian sebagai parameter ketiga akan memberi Anda stacktrace penuh dalam logcat.

105
Philipp Reichart

Yang berikut harus melakukan trik:

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

Perhatikan bahwa ...x more di akhir tidak memotong informasi apa pun dari jejak tumpukan:

(Ini menunjukkan) bahwa sisa jejak tumpukan untuk pengecualian ini cocok dengan jumlah bingkai yang ditunjukkan dari bagian bawah jejak tumpukan pengecualian yang disebabkan oleh pengecualian ini (pengecualian "melampirkan").

... atau dengan kata lain, ganti x more dengan baris x terakhir dari pengecualian pertama.

131
Michael Berry

Gunakan Log.getStackTraceString (Throwable t). Anda bisa mendapatkan jejak tumpukan yang lebih lama dengan menggali lebih dalam. Sebagai contoh:

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

Diperoleh dari 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

Anda dapat menggunakan ini:

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

Anda juga dapat mencetak jejak tumpukan di setiap titik dalam kode aplikasi Anda menggunakan metode seperti Thread.dumpStack() 

Silakan buka tautan untuk perincian lebih lanjut

2
ajaykoppisetty

Anda perlu menggunakan Objek Throwable untuk mendapatkan stackTrace penuh.

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