Как получить текущую трассировку стека в Java, например, как в .NET вы можете сделать Environment.StackTrace
?
Я нашел, Thread.dumpStack()
но это не то, что я хочу - я хочу вернуть трассировку стека, а не распечатать его.
stack-trace
java
ripper234
источник
источник
Ответы:
Вы можете использовать
Thread.currentThread().getStackTrace()
.Это возвращает массив
StackTraceElement
s, которые представляют текущую трассировку стека программы.источник
String fullStackTrace = org.apache.commons.lang.exception.ExceptionUtils.getFullStackTrace(e);
new Throwable().getStackTrace()
гораздо быстрее, потому что не нужно проверятьthis != Thread.currentThread()
и обходить потенциальные издержки JVM при вызове через child-class (Exception extends Throwable
)хорошо, если вам все равно, какой первый элемент стека.
будет иметь определенную позицию для вашего текущего метода, если это имеет значение.
источник
(new Throwable()).getStackTrace()
выполняется быстрее (см. bugs.sun.com/bugdatabase/view_bug.do?bug_id=6375302 )(new Exception()).getStackTrace()
когда запрашиваемая трассировки стека на текущем потоке (который всегда будет иметь место в случаеThread.currentThread().getStackTrace();
источник
new Exception().printStackTrace(System.out)
что я помню, цикл for, вероятно, имеет меньше накладных расходов, но вы все равно должны использовать это только как средство отладки ...for (StackTraceElement ste : Thread.currentThread().getStackTrace()) { if(ste.toString().contains("mypackages")){ System.out.println(ste); } }
доступен с JDK1.5.
Для более старой версии вы можете перенаправить
exception.printStackTrace()
наStringWriter()
:источник
new Throwable().getStackTrace()
доступен с JDK1.4…Вы можете использовать Apache для этого:
источник
org.apache.commons.lang3
, полная строка:org.apache.commons.lang3.exception.ExceptionUtils.getStackTrace(e);
org.apache.commons.lang3
, который я изначально пропустил - импорт используетlang3
вместоlang
, а заменяетgetFullStackTrace
наgetStackTrace
.ExceptionUtils.getStackTrace(new Throwable())
выражение для получения трассировки стека.На Android гораздо проще использовать это:
источник
Чтобы получить трассировку стека всех потоков, вы можете использовать утилиту jstack, JConsole или отправить сигнал kill -quit (в операционной системе Posix).
Однако, если вы хотите сделать это программно, вы можете попробовать использовать ThreadMXBean:
Как уже упоминалось, если вам нужна только трассировка стека текущего потока, это намного проще - просто используйте
Thread.currentThread().getStackTrace()
;источник
System.err.println(elems[i])
для каждого). Вторая строка во фрагменте отсутствуетbean.
раньше,dumpAllThreads
но я думаю, что большинство людей могли бы решить это.Другое решение (всего
3531 символов):источник
Глупый я, это
Thread.currentThread().getStackTrace();
источник
Тони, в качестве комментария к принятому ответу, дал лучший ответ, который на самом деле отвечает на вопрос ОП :
... OP НЕ спрашивал, как получить
String
трассировку стека отException
. И хотя я большой поклонник Apache Commons, когда есть что-то простое, как указано выше, нет логической причины использовать стороннюю библиотеку.источник
Thread.getAllStackTraces()
который дает вамMap<Thread, StackTraceElement[]>
. Hotspot будет защищать все потоки всякий раз, когда это необходимо. Zing может привести отдельные темы в безопасную точку, не мешая другим. Получение трассировки стека требует безопасной точки.Thread.getAllStackTraces()
получает все трассировки стека и останавливает все потоки только один раз. Конечно, вы должны выяснить, какое отображение вам на самом деле интересно.Я предполагаю, что
это более простой способ, и его преимущество заключается в том, что на самом деле не создается исключение и не может быть выброшено, когда проблемы могут вообще не быть, и это значительно более важно.
источник
new Exception("Stack trace").printStackTrace();
так что он на самом деле строит ThrowableПолучение трассировки стека:
Печать трассировки стека (JAVA 8+):
Печатание укладки (JAVA 7):
источник
В Java 9 появился новый способ:
источник
У меня есть служебный метод, который возвращает строку с трассировкой стека:
И просто логит как ...
источник
java.util.logging.Logger#log(Level, String, Throwable)
уже делает это. Это переписывает вещи, которые уже существуют в стандартной библиотеке Java без необходимости, и указывает новым разработчикам в неправильном направлении, что далеко от документации. Сделав это сейчас, вы заставили Stacktrace форматироваться определенным образом, гдеlogging
API позволяет динамически изменять форматирование оператора log по мере его указания. Насколько мне известно,log4j
также имеет аналогичное поведение. Не изобретайте велосипед, потому что вы теряете вещи, как я объяснил.Throwable
прочь кHandler
с помощью кFormatter
с в 2012 году , который был Java7, больше , чем я перечислил здесь И эти функции датируются гораздо дольше , чем Java7 было вокруг,. , следовательно , J2SE 5,0 JavaDocs)Для струнной гуавы:
источник
или
источник
Может быть, вы могли бы попробовать это:
Строка errorDetail содержит трассировку стека.
источник
переберите StackTraceElement и получите желаемый результат.
источник
Я использовал ответы сверху и добавил форматирование
источник
Вы можете использовать утилиту jstack, если хотите проверить текущий стек вызовов вашего процесса.
источник
Это старый пост, но вот мое решение:
Больше информации и методов здесь: http://javarevisited.blogspot.fr/2013/04/how-to-get-current-stack-trace-in-java-thread.html
источник
Thread.dumpStack()
напрямую, потому что это статический метод.System.out.println(Arrays.toString(Thread.currentThread().getStackTrace()));
Это поможет вам распечатать трассировку стека без цикла.
источник