Pertanyaan Dapatkan jejak stack saat ini di Java


Bagaimana cara mendapatkan jejak stack saat ini di Java, seperti bagaimana caranya .BERSIH Anda dapat melakukan Environment.StackTrace?

BTW, Thread.dumpStack() bukan apa yang saya inginkan - saya ingin mendapatkan jejak stack kembali, bukan mencetaknya.


853
2017-07-01 13:13


asal


Jawaban:


Kamu dapat memakai Benang.currentThread().getStackTrace().

Yang mengembalikan array StackTraceElements yang mewakili jejak stack saat ini dari suatu program.


1004
2017-07-01 13:15



Thread.currentThread().getStackTrace();

tidak masalah jika Anda tidak peduli apa elemen pertama dari tumpukan itu.

new Throwable().getStackTrace();

akan memiliki posisi yang ditentukan untuk metode Anda saat ini, jika itu penting.


227
2017-07-01 13:29



for (StackTraceElement ste : Thread.currentThread().getStackTrace()) {
    System.out.println(ste);
}

160
2017-08-08 14:46



Thread.currentThread().getStackTrace();

tersedia sejak JDK1.5.

Untuk versi yang lebih lama, Anda dapat mengalihkan exception.printStackTrace() ke a StringWriter() :

StringWriter sw = new StringWriter();
new Throwable("").printStackTrace(new PrintWriter(sw));
String stackTrace = sw.toString();

54
2017-07-01 14:13



Anda dapat menggunakan Apache's commons untuk itu:

String fullStackTrace = org.apache.commons.lang3.exception.ExceptionUtils.getStackTrace(e);

34
2018-05-16 14:41



Di Android cara yang jauh lebih mudah adalah dengan menggunakan ini:

import android.util.Log;
String stackTrace = Log.getStackTraceString(exception); 

21
2018-04-30 07:28



Untuk mendapatkan jejak stack dari semua thread Anda dapat menggunakan utilitas jstack, JConsole atau mengirim sinyal kill -quit (pada sistem operasi Posix).

Namun, jika Anda ingin melakukan ini secara terprogram, Anda dapat mencoba menggunakan ThreadMXBean:

ThreadMXBean bean = ManagementFactory.getThreadMXBean();
ThreadInfo[] infos = bean.dumpAllThreads(true, true);

for (ThreadInfo info : infos) {
  StackTraceElement[] elems = info.getStackTrace();
  // Print out elements, etc.
}

Seperti disebutkan, jika Anda hanya ingin jejak stack dari thread saat ini jauh lebih mudah - Cukup gunakan Thread.currentThread().getStackTrace();


18
2017-07-01 13:19



Solusi lain (saja 35 31 karakter):

new Exception().printStackTrace();   
new Error().printStackTrace();

16
2018-01-05 10:52