Я думаю о создании инструмента отладки для моего Java-приложения.
Я задаюсь вопросом, возможно ли получить трассировку стека, точно так же, как и Exception.printStackTrace()
без фактического исключения?
Моя цель состоит в том, чтобы в любом данном методе создать дамп стека, чтобы увидеть, кто является вызывающим методом.
public static void dumpStack() { new Exception("Stack trace").printStackTrace(); }
stderr
, что, по-видимому, является следствием вопроса.Если вам нужна трассировка только для текущего потока (а не для всех потоков в системе, как рекомендует Рам), выполните:
Thread.currentThread (). getStackTrace ()
Чтобы найти абонента, выполните:
И вызовите этот метод из метода, который должен знать, кто его вызывает. Однако, предупреждающее слово: индекс вызывающего кадра в списке может варьироваться в зависимости от JVM! Все зависит от того, сколько уровней вызовов есть в getStackTrace, прежде чем вы достигнете точки, где генерируется трассировка. Более надежным решением было бы получить трассировку и перебрать ее, ища фрейм для getCallingMethodName, а затем сделать еще два шага вверх, чтобы найти истинного абонента.
источник
Вы можете получить трассировку стека следующим образом:
Если вы хотите получить доступ к фрейму, вы можете использовать t.getStackTrace (), чтобы получить массив фреймов стека.
Имейте в виду, что в этой трассировке стека (как и в любом другом) могут отсутствовать некоторые кадры, если компилятор горячей точки был занят оптимизацией.
источник
t.printStackTrace
наt.printStackTrace(System.out)
.new Throwable().printStackTrace(System.out);
log.log(Level.SEVERE, "Failed to do something", new Throwable());
Обратите внимание, что Thread.dumpStack () фактически генерирует исключение:
источник
Вы также можете отправить сигнал в JVM для выполнения Thread.getAllStackTraces () в работающем Java-процессе, отправив в него сигнал QUIT.
В Unix / Linux используйте:
kill -QUIT process_id
где process_id - это номер процесса вашей Java-программы.В Windows вы можете нажать Ctrl-Break в приложении, хотя обычно вы этого не увидите, если не запускаете консольный процесс.
JDK6 представил другую опцию, команду jstack, которая будет отображать стек из любого запущенного процесса JDK6 на вашем компьютере:
jstack [-l] <pid>
Эти параметры очень полезны для приложений, которые работают в производственной среде и не могут быть легко изменены. Они особенно полезны для диагностики тупиков во время выполнения или проблем с производительностью.
http://java.sun.com/developer/technicalArticles/Programming/Stacktrace/ http://java.sun.com/javase/6/docs/technotes/tools/share/jstack.html
источник
Если вам нужен захват вывода
источник
Java 9 представила
StackWalker
и поддерживающие классы для обхода стека.Вот несколько фрагментов из Javadoc:
источник
HPROF Java Profiler
Вам даже не нужно делать это в коде. Вы можете присоединить Java HPROF к вашему процессу и в любой момент нажать Control- \, чтобы вывести дамп кучи, запущенные потоки и т. Д. , , не портя код вашего приложения. Это немного устарело, Java 6 поставляется с jconsole с графическим интерфейсом, но я все еще нахожу HPROF очень полезным.
источник
Ответ Роб Ди Марко , безусловно, лучше всего, если вы рады выходу в
stderr
.Если вы хотите записать в
String
, с новыми строками в соответствии с обычной трассировкой, вы можете сделать это:источник