Bagaimana cara mendapatkan jejak tumpukan saat ini di Jawa, seperti bagaimana di .NET yang dapat Anda lakukan Environment.StackTrace
?
saya menemukan Thread.dumpStack()
tetapi bukan itu yang saya inginkan - Saya ingin mendapatkan jejak tumpukan kembali, bukan mencetaknya.
stack-trace
java
ripper234
sumber
sumber
Jawaban:
Kamu bisa menggunakan
Thread.currentThread().getStackTrace()
.Itu mengembalikan array
StackTraceElement
s yang mewakili jejak stack saat ini dari suatu program.sumber
String fullStackTrace = org.apache.commons.lang.exception.ExceptionUtils.getFullStackTrace(e);
stackoverflow.com/a/10620951/11236new Throwable().getStackTrace()
ini jauh lebih cepat, karena tidak perlu memeriksathis != Thread.currentThread()
dan memotong overhead JVM potensial untuk memanggilnya melalui kelas anak-anak (Exception extends Throwable
)tidak masalah jika Anda tidak peduli apa elemen pertama dari tumpukan itu.
akan memiliki posisi yang ditentukan untuk metode Anda saat ini, jika itu penting.
sumber
(new Throwable()).getStackTrace()
lebih cepat mengeksekusi juga (lihat bugs.sun.com/bugdatabase/view_bug.do?bug_id=6375302 )(new Exception()).getStackTrace()
ketika jejak stack yang diminta ada di utas saat ini (yang akan selalu menjadi kasus untukThread.currentThread().getStackTrace();
sumber
new Exception().printStackTrace(System.out)
yang dapat saya ingat, for for loop mungkin memiliki overhead yang lebih sedikit, tetapi Anda seharusnya hanya menggunakan ini sebagai hal debugging ...for (StackTraceElement ste : Thread.currentThread().getStackTrace()) { if(ste.toString().contains("mypackages")){ System.out.println(ste); } }
tersedia sejak JDK1.5.
Untuk versi yang lebih lama, Anda dapat mengarahkan ulang
exception.printStackTrace()
keStringWriter()
:sumber
new Throwable().getStackTrace()
tersedia sejak JDK1.4…Anda dapat menggunakan commons Apache untuk itu:
sumber
org.apache.commons.lang3
, baris lengkapnya adalah:org.apache.commons.lang3.exception.ExceptionUtils.getStackTrace(e);
org.apache.commons.lang3
, yang awalnya saya abaikan - impor menggunakanlang3
alih-alihlang
, dan digantigetFullStackTrace
dengangetStackTrace
.ExceptionUtils.getStackTrace(new Throwable())
ekspresi untuk mendapatkan jejak stack.Di android cara yang jauh lebih mudah adalah dengan menggunakan ini:
sumber
Untuk mendapatkan jejak stack dari semua thread Anda bisa menggunakan utilitas jstack, JConsole atau mengirim sinyal kill -quit (pada sistem operasi Posix).
Namun, jika Anda ingin melakukan ini secara terprogram Anda bisa mencoba menggunakan ThreadMXBean:
Seperti yang disebutkan, jika Anda hanya ingin jejak tumpukan utas saat ini jauh lebih mudah - Cukup gunakan
Thread.currentThread().getStackTrace()
;sumber
System.err.println(elems[i])
pada masing-masing). Baris kedua dalam cuplikan tidak adabean.
sebelumdumpAllThreads
tetapi saya kira kebanyakan orang bisa menyelesaikannya.Solusi lain (hanya
3531 karakter):sumber
Bodoh aku, ini
Thread.currentThread().getStackTrace();
sumber
Tony, sebagai komentar atas jawaban yang diterima, telah memberikan apa yang tampaknya merupakan jawaban terbaik yang sebenarnya menjawab pertanyaan OP :
... OP TIDAK bertanya bagaimana cara mendapatkan
String
dari jejak stack dariException
. Dan meskipun saya penggemar berat Apache Commons, ketika ada sesuatu yang sederhana seperti di atas tidak ada alasan logis untuk menggunakan perpustakaan luar.sumber
Thread.getAllStackTraces()
yang memberi AndaMap<Thread, StackTraceElement[]>
. Hotspot akan melindungi semua utas kapan pun ia membutuhkannya. Zing dapat membawa masing-masing utas ke titik aman tanpa mengganggu yang lain. Mendapatkan stacktrace membutuhkan titik aman.Thread.getAllStackTraces()
mendapatkan semua jejak tumpukan dan menghentikan semua utas hanya sekali. Tentu saja, Anda harus mencari tahu pemetaan mana yang benar-benar Anda minati.Saya menyarankan itu
adalah cara yang lebih mudah dan memiliki keuntungan karena tidak benar-benar membangun pengecualian atau yang bisa dibuang ketika mungkin tidak ada masalah sama sekali, dan jauh lebih penting.
sumber
new Exception("Stack trace").printStackTrace();
jadi itu sebenarnya membangun ThrowableMendapatkan stacktrace:
Mencetak stacktrace (JAVA 8+):
Mencetak stacktrage (JAVA 7):
sumber
Di Jawa 9 ada cara baru:
sumber
Saya memiliki metode utilitas yang mengembalikan string dengan stacktrace:
Dan cukup logit seperti ...
sumber
java.util.logging.Logger#log(Level, String, Throwable)
sudah melakukan ini. Ini menulis ulang hal-hal yang sudah ada di perpustakaan standar Java yang tidak perlu dan menunjuk pengembang baru ke arah yang salah, yang jauh dari dokumentasi. Dengan melakukan ini sekarang, Anda telah memaksa Stacktrace diformat dengan cara tertentu, sedangkanlogging
API memungkinkan Anda untuk memvariasikan pemformatan pernyataan log secara dinamis saat Anda menentukannya. Setahu saya,log4j
juga punya perilaku serupa juga. Jangan menemukan kembali roda karena Anda akhirnya kehilangan hal-hal seperti yang saya jelaskan.Throwable
off keHandler
s melalui keFormatter
s pada 2012 yang Java7, lebih dari saya sudah tercantum di sini Dan fungsi-fungsi ini tanggal kembali jauh lebih lama dari Java7 telah sekitar;. maka J2SE 5.0 javadocs)Untuk merangkai dengan jambu biji:
sumber
atau
sumber
Mungkin Anda bisa mencoba ini:
String 'errorDetail' berisi stacktrace.
sumber
loop melalui StackTraceElement dan dapatkan hasil yang Anda inginkan.
sumber
Saya menggunakan jawaban dari atas dan menambahkan pemformatan
sumber
Anda dapat menggunakan utilitas jstack jika Anda ingin memeriksa tumpukan panggilan saat ini dari proses Anda.
sumber
Ini adalah pos lama, tapi ini solusinya:
Info lebih lanjut dan lebih banyak metode di sana: http://javarevisited.blogspot.fr/2013/04/how-to-get-current-stack-trace-in-java-thread.html
sumber
Thread.dumpStack()
langsung karena metode statisnya.System.out.println(Arrays.toString(Thread.currentThread().getStackTrace()));
Ini akan membantu Anda untuk mencetak jejak tumpukan tanpa loop.
sumber