Frage Aktuellen Stack-Trace in Java abrufen


Wie bekomme ich die aktuelle Stack-Trace in Java, wie in .NETZ du kannst tun Environment.StackTrace?

BTW, Thread.dumpStack() ist nicht was ich will - ich will das bekommen Stapelverfolgung zurück, nicht ausdrucken.


853
2017-07-01 13:13


Ursprung


Antworten:


Sie können verwenden Faden.currentThread().getStackTrace().

Das gibt ein Array von StackTraceElements, die den aktuellen Stack-Trace eines Programms darstellen.


1004
2017-07-01 13:15



Thread.currentThread().getStackTrace();

ist in Ordnung, wenn es Ihnen egal ist, was das erste Element des Stapels ist.

new Throwable().getStackTrace();

wird eine definierte Position für Ihre aktuelle Methode haben, wenn das wichtig ist.


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();

ist seit JDK1.5 verfügbar.

Für eine ältere Version können Sie umleiten exception.printStackTrace() zu einem StringWriter() :

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

54
2017-07-01 14:13



Sie können Apaches Commons dafür verwenden:

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

34
2018-05-16 14:41



Auf Android ist ein viel einfacherer Weg, dies zu verwenden:

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

21
2018-04-30 07:28



Um den Stack-Trace aller Threads zu erhalten, können Sie entweder das Jstack-Dienstprogramm, JConsole oder ein Kill-Quit-Signal (auf einem Posix-Betriebssystem) senden.

Wenn Sie dies jedoch programmgesteuert durchführen möchten, können Sie versuchen, ThreadMXBean zu verwenden:

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

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

Wie erwähnt, wenn Sie nur die Stack-Trace des aktuellen Threads wollen, ist es viel einfacher - einfach verwenden Thread.currentThread().getStackTrace();


18
2017-07-01 13:19



Eine andere Lösung (nur 35 31 Zeichen):

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

16
2018-01-05 10:52