Di Android (Jawa) bagaimana cara mencetak jejak tumpukan penuh? Jika aplikasi saya macet dari nullPointerException atau sesuatu, itu akan 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?
Jawaban:
Ada penggantian semua metode log dengan
(String tag, String msg, Throwable tr)
tanda tangan.Melewati pengecualian sebagai parameter ketiga harus memberi Anda stacktrace penuh di logcat.
sumber
getStackTraceString()
metode yang disebutkan oleh @Thomas di belakang layar.Yang berikut harus melakukan trik:
Perhatikan bahwa
...x more
pada akhirnya tidak memotong informasi apa pun dari jejak tumpukan:... atau dengan kata lain, ganti
x more
denganx
baris terakhir dari pengecualian pertama.sumber
getStackTraceString()
? Tidak muncul di Eclipse? Itu bukan bagian dariThrowable
atauException
....import android.util.Log;
).Gunakan Log.getStackTraceString (Throwable t). Anda bisa mendapatkan jejak tumpukan yang lebih lama dengan menggali lebih dalam. Sebagai contoh:
Diperoleh dari http://developer.android.com/reference/android/util/Log.html#getStackTraceString%28java.lang.Throwable%29
sumber
Log.getStackTraceString()
tidak mencatat jejak stack, ia hanya mengembalikannya sebagai String. Kode di atas tidak akan mencatat apa pun dan juga akan gagal dengan NPE jikae.getCause()
adanull
.sumber
Anda dapat menggunakan ini:
sumber
Anda juga dapat mencetak jejak tumpukan di setiap titik dalam kode aplikasi Anda menggunakan metode seperti
Thread.dumpStack()
Silakan buka tautan untuk detail lebih lanjut
sumber
Anda perlu menggunakan Throwable Object untuk mendapatkan stackTrace lengkap.
Ref: https://stackoverflow.com/a/18546861
sumber
Saya cepat lakukan sekarang fungsi rekursif yang akan mengulangi throwable dan throwable.getCause ().
Itu karena setiap "throwable.getCause ()" mengembalikan kepada Anda pesan pengecualian baru dengan beberapa baris berulang dan baris baru. Jadi konsepnya adalah: jika ada "penyebab" ada garis dengan "n lebih .." pada main throwable jadi saya mendapatkan baris terakhir sebelum yang dengan "n lebih .." maka saya mendapatkan pesan penyebab dan akhirnya saya substring pesan sebab hanya mendapatkan bagian setelah baris berulang terakhir (baris terakhir yang muncul di keduanya: main throwable dan penyebab throwable).
Kemudian saya menggunakan rekursi ketika saya mendapatkan pesan penyebab, jadi memanggil kembali fungsi yang sama untuk mendapatkan pesan penyebab dari throwable utama saya akan mendapatkan pesan yang sudah diganti. Jika penyebab lemparan dari lemparan utama juga memiliki penyebab lain, maka lemparan utama memiliki 3 level (utama -> penyebab -> penyebab-penyebab), pada lemparan utama saya akan mendapatkan "pesan" pesan yang sudah diganti (menggunakan konsep utama yang sama
Saya mencobanya hanya dengan 2 level (utama -> penyebab) dan tidak dengan lebih banyak: / Jika ada yang salah silakan edit fungsinya dan tulis komentar: D
Selamat menikmati coding dan hari yang menyenangkan: D
Penting:
Kode ini terkadang mendapatkan pengecualian jika "st" tidak mengandung "\ n" atau serupa (saya menemukan beberapa jenis pengecualian stacktraces memiliki masalah ini). Untuk mengatasi ini, Anda perlu menambahkan beberapa cek sebelum baris kode: "String r1 = ..."
Anda perlu memeriksa: "st" berisi "\ n" dan bahwa indeks awal & akhir "st.subSequence" keduanya valid.
Pokoknya saya sarankan untuk meletakkan ini di dalam try-catch dan mengembalikan string kosong jika terkecuali. (Ini rekursif sehingga string kosong yang dikembalikan akan digabungkan ke string yang diproses sebelumnya).
sumber