Wie erhalte ich den aktuellen Stack-Trace in Java, wie in .NET Environment.StackTrace
?
Ich habe gefunden, Thread.dumpStack()
aber es ist nicht das, was ich will - ich möchte den Stack-Trace zurückbekommen, nicht ausdrucken.
stack-trace
java
ripper234
quelle
quelle
Antworten:
Sie können verwenden
Thread.currentThread().getStackTrace()
.Das gibt ein Array von
StackTraceElement
s zurück, das den aktuellen Stack-Trace eines Programms darstellt.quelle
String fullStackTrace = org.apache.commons.lang.exception.ExceptionUtils.getFullStackTrace(e);
Einzeiler,new Throwable().getStackTrace()
ist viel schneller, weil esthis != Thread.currentThread()
potenzielle JVM-Overheads beim Aufrufen über child-class (Exception extends Throwable
) nicht überprüfen und umgehen mussist in Ordnung, wenn es Ihnen egal ist, was das erste Element des Stapels ist.
wird eine definierte Position für Ihre aktuelle Methode haben, wenn das wichtig ist.
quelle
(new Throwable()).getStackTrace()
ist auch schneller auszuführen (siehe bugs.sun.com/bugdatabase/view_bug.do?bug_id=6375302 )(new Exception()).getStackTrace()
der angeforderte Stack-Trace im aktuellen Thread befindet (was fürThread.currentThread().getStackTrace();
quelle
new Exception().printStackTrace(System.out)
Ich kann mich erinnern, dass die for-Schleife wahrscheinlich weniger Overhead hat, aber Sie sollten diese sowieso nur als Debugging-Sache verwenden ...for (StackTraceElement ste : Thread.currentThread().getStackTrace()) { if(ste.toString().contains("mypackages")){ System.out.println(ste); } }
ist seit JDK1.5 verfügbar.
Bei einer älteren Version können Sie
exception.printStackTrace()
zu einem umleitenStringWriter()
:quelle
new Throwable().getStackTrace()
ist seit JDK1.4 verfügbar…Sie können Apaches Commons dafür verwenden:
quelle
org.apache.commons.lang3
org.apache.commons.lang3.exception.ExceptionUtils.getStackTrace(e);
org.apache.commons.lang3
, den ich anfangs übersehen habe - der Import verwendetlang3
anstelle vonlang
und ersetztgetFullStackTrace
durchgetStackTrace
.ExceptionUtils.getStackTrace(new Throwable())
Ausdruck zum Abrufen des Stack-Trace zu verwenden.Unter Android ist es weitaus einfacher, Folgendes zu verwenden:
quelle
Um die Stapelverfolgung aller Threads abzurufen, können Sie entweder das Dienstprogramm jstack, JConsole, verwenden oder ein Kill-Quit-Signal senden (auf einem Posix-Betriebssystem).
Wenn Sie dies jedoch programmgesteuert ausführen möchten, können Sie ThreadMXBean verwenden:
Wie bereits erwähnt, ist es viel einfacher, wenn Sie nur den Stack-Trace des aktuellen Threads verwenden möchten
Thread.currentThread().getStackTrace()
.quelle
System.err.println(elems[i])
jeweils tun ). Die zweite Zeile im Snippet fehltbean.
vor dem,dumpAllThreads
aber ich denke, die meisten Leute könnten das klären.Eine andere Lösung (nur
3531 Zeichen):quelle
Dumm von mir, das ist es
Thread.currentThread().getStackTrace();
quelle
Tony hat als Kommentar zu der akzeptierten Antwort die scheinbar beste Antwort gegeben, die die Frage des OP tatsächlich beantwortet :
... das OP hat NICHT gefragt, wie man eine
String
vom Stack-Trace von einem bekommtException
. Und obwohl ich ein großer Fan von Apache Commons bin, gibt es keinen logischen Grund, eine externe Bibliothek zu verwenden, wenn es etwas so Einfaches wie das oben Genannte gibt.quelle
Thread.getAllStackTraces()
, was Ihnen eine gibtMap<Thread, StackTraceElement[]>
. Hotspot speichert alle Threads sicher, wann immer sie einen sicheren Punkt benötigen. Zing kann einzelne Threads zu einem sicheren Punkt bringen, ohne den anderen zu stören. Um eine Stapelverfolgung zu erhalten, ist ein Sicherheitspunkt erforderlich.Thread.getAllStackTraces()
Ruft alle Stack-Traces ab und stoppt alle Threads nur einmal. Natürlich müssen Sie herausfinden, an welchem Mapping Sie tatsächlich interessiert sind.Ich schlage vor, dass
ist ein einfacher Weg und hat den Vorteil, dass keine Ausnahme erstellt oder ausgelöst werden kann, wenn möglicherweise überhaupt kein Problem vorliegt, und ist wesentlich wichtiger.
quelle
new Exception("Stack trace").printStackTrace();
Es wird also tatsächlich ein ThrowableStacktrace erhalten:
Stacktrace drucken (JAVA 8+):
Stacktrage drucken (JAVA 7):
quelle
In Java 9 gibt es einen neuen Weg:
quelle
Ich habe eine Dienstprogrammmethode, die einen String mit dem Stacktrace zurückgibt:
Und loggen Sie einfach wie ...
quelle
java.util.logging.Logger#log(Level, String, Throwable)
macht das schon. Dies schreibt Dinge, die bereits in der Java-Standardbibliothek vorhanden sind, unnötig um und weist neue Entwickler in die falsche Richtung, die von der Dokumentation abweicht. Auf diese Weise haben Sie jetzt die Formatierung des Stacktrace auf eine bestimmte Weise erzwungen, wobei Sie mit derlogging
API die Formatierung der Protokollanweisung dynamisch variieren können, während Sie sie angeben. Meines Wissens hatlog4j
auch ähnliches Verhalten. Erfinden Sie das Rad nicht neu, weil Sie am Ende Dinge verlieren, wie ich sie erklärt habe.Throwable
dasHandler
s an das s bis zumFormatter
s im Jahr 2012 weitergeben, das Java7 war, mehr als ich hier aufgelistet habe. Und diese Funktionen reichen viel länger zurück als Java7; daher J2SE 5.0 javadocs)So schnüren Sie mit Guave:
quelle
oder
quelle
Vielleicht könnten Sie das versuchen:
Die Zeichenfolge 'errorDetail' enthält die Stapelverfolgung.
quelle
Durchlaufen Sie StackTraceElement und erhalten Sie das gewünschte Ergebnis.
quelle
Ich habe Antworten von oben verwendet und Formatierungen hinzugefügt
quelle
Sie können das Dienstprogramm jstack verwenden, wenn Sie den aktuellen Aufrufstapel Ihres Prozesses überprüfen möchten.
quelle
Dies ist ein alter Beitrag, aber hier ist meine Lösung:
Weitere Informationen und Methoden finden Sie dort: http://javarevisited.blogspot.fr/2013/04/how-to-get-current-stack-trace-in-java-thread.html
quelle
Thread.dumpStack()
wegen seiner statischen Methode direkt aufrufen .System.out.println(Arrays.toString(Thread.currentThread().getStackTrace()));
Auf diese Weise können Sie die Stapelverfolgung ohne Schleife drucken.
quelle