Шаг 59.
Язык программирования Java.
Трассировка стека вызовов функций

На этом шаге мы рассмотрим трассировку стека вызовов функций

Трассировка стека - это список вызовов методов в данной точке выполнения программы. Подобные списки вы могли видеть при выполнении программы, в которой не проверяется проверяемое исключение.

Для получения текстового описания трассировки стека достаточно вызвать метод printStackTrace() из класса Throwable.

Более удобный способ состоит в вызове метода getStackTrace(), возвращающего массив объектов типа StackTraceElement, которые можно проанализировать в программе, как в следующем примере кода:

Throwable t = new Throwable();
StackTraceElement[] stackTraceElements = t.getStackTrace();

for (StackTraceElement stackTraceElement : stackTraceElements) {
	анализ stackTraceElement
}

Класс StackTraceElement содержит методы, позволяющие получить имя файла, номер исполняющей строки, а также имя класса и метода. Отформатированную строку, содержащую эти сведения, предоставляет метод toString(). А метод Thread.getAllStackTraces() позволяет получить трассировку стека во всех потоках.

Приведем ниже пример работы с трассировкой стека.

/**
 * <p>Класс для тестирования трассировки стека</p>
 * */
public class StackTraceTest {
    /**
     * <p>Функция для нахождения факториала. Перед расчетом факториала выводится 
     *                                                         стек-трайс функции</p>
     * @param n Файкториал чего мы считаем
     * @return Значение факториала
     * */
    public static int factorial(int n) {
        System.out.println("factorial(" + n + "):");

        Throwable throwable = new Throwable();
        StackTraceElement[] stackTraceElements = throwable.getStackTrace();

        for (StackTraceElement stackTraceElement : stackTraceElements) {
            System.out.println(stackTraceElement);
        }

        int ans = 1;
        if (n > 1) {
            ans = n * factorial(n - 1);
        }

        System.out.println("return " + ans);

        return ans;
    }

    public static void main(String[] args) {
        factorial(3);
    }
}

Проект можно взять здесь


Рис. 1. Вывод программы

На следующем шаге мы рассмотрим применение утверждений

Предыдущий шаг Содержание Следующий шаг