Подтвердить что ты не робот

Печать полного стека вызовов на printStackTrace()?

Мне нужно написать небольшое приложение анализатора журналов для обработки некоторых файлов журналов, созданных третьей библиотекой закрытых исходников (с встроенным регистратором внутри), используемым в моем проекте.

В случае записи исключения в журнале мне нужно собрать агрегированную информацию о методах, связанных с трассировкой стека, от вершины до фактического места исключения.

К сожалению, по умолчанию Java printStackTrace() не печатает каждый метод в стеке вызовов, а до определенного числа, а остальное просто ссылается на 16 more....

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

Есть ли способ попросить Java распечатать весь стек вызовов в стеке?

Помимо моей ситуации, общие рамки ведения журнала имеют для этого возможность?

Изменить: Программа работает на Sun JVM с JDK 1.5.0_09. Нет возможности изменить это.

4b9b3361

Ответ 1

вот объяснение строк "вызвано" и "... больше" в печатной трассе. см. также JavaDoc для printStackTrace. у вас может не быть работы.

Обратите внимание на наличие строк, содержащих символы "...". Эти строки указывают, что оставшаяся часть трассировки стека для этого исключения совпадает с указанным числом кадров из нижней части трассировки стека исключения, вызванного этим исключением (исключение "охватывающего" ). Эта сокращенность может значительно уменьшить длину вывода в общем случае, когда обернутое исключение выбрасывается из того же метода, что и "причинное исключение".

Ответ 2

Вы не можете что-то сделать с Thread.currentThread().getStackTrace()?

Вот реальный простой пример, который вызывает метод рекурсивно 20 раз, а затем выгружает стек текущего потока.

public class Test {
    public static void main(String[] args) {
        method();
    }

    static int x = 0;
    private static void method() {
        if(x>20) {
            StackTraceElement[] elements = Thread.currentThread().getStackTrace();

            for(int i=0; i<elements.length; i++) {
                System.out.println(elements[i]);
            }
        }
        else {
            x++;
            method();
        }
    }
}

Ответ 3

Может быть, вы можете попробовать выполнить итерацию по массиву, возвращаемому:

Thread.currentThread().getStackTrace();