Есть ли способ вывести трассировку стека без выдачи исключения в Java?

Попробуйте это вместо.

<Window x:Class="BuildAssistantUI.BuildAssistantWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:VM="clr-namespace:BuildAssistantUI.ViewModels">
    <Window.DataContext>
        <VM:MainViewModel />
    </Window.DataContext>
</Window>
140
задан bruno 10 June 2015 в 17:21
поделиться

6 ответов

Вы можете также попробуйте Thread.getAllStackTraces () , чтобы получить карту трассировки стека для всех активных потоков.

81
ответ дан 23 November 2019 в 22:46
поделиться

Да, просто используйте

Thread.dumpStack()
229
ответ дан 23 November 2019 в 22:46
поделиться

Если вам нужна трассировка только для текущего потока (а не для всех потоков в системе, как предлагает Рама), выполните:

Thread.currentThread (). getStackTrace ()

Чтобы найти вызывающего, выполните:

private String getCallingMethodName() {
    StackTraceElement callingFrame = Thread.currentThread().getStackTrace()[4];
    return callingFrame.getMethodName();
}

И вызовите этот метод изнутри метода, который должен знать, кто его вызывающий. Однако небольшое предупреждение: индекс вызывающего кадра в списке может варьироваться в зависимости от JVM! Все зависит от того, сколько уровней вызовов содержится в getStackTrace, прежде чем вы достигнете точки, в которой создается трассировка. Более надежным решением было бы получить трассировку и перебрать ее в поисках кадра для getCallingMethodName, а затем сделать два шага дальше, чтобы найти истинного вызывающего.

40
ответ дан 23 November 2019 в 22:46
поделиться

Вы также можете отправить сигнал 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

6
ответ дан 23 November 2019 в 22:46
поделиться

Вы можете получить трассировку стека следующим образом:

Throwable t = new Throwable();
t.printStackTrace();

Если вы хотите получить доступ к кадру, вы можете использовать t.getStackTrace () для получения массива кадров стека.

Будьте известно, что в этой трассировке стека (как и в любой другой) могут отсутствовать некоторые кадры, если компилятор точки доступа был занят оптимизацией.

34
ответ дан 23 November 2019 в 22:46
поделиться

HPROF Java Profiler

Вам даже не нужно делать это в коде. Вы можете прикрепить Java HPROF к своему процессу и в любой момент нажать Control- \ для вывода дампа кучи, запущенных потоков и т. Д. . . без искажения кода вашего приложения. Это немного устарело, Java 6 поставляется с jconsole графического интерфейса пользователя, но я все еще считаю HPROF очень полезным.

0
ответ дан 23 November 2019 в 22:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: