Печатать полный стек вызовов на printStackTrace ()? - PullRequest
42 голосов
/ 25 июня 2009

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

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

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

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

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

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

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

Ответы [ 3 ]

29 голосов
/ 25 июня 2009

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

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

5 голосов
/ 25 июня 2009

Ты не можешь что-то сделать с 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();
        }
    }
}
0 голосов
/ 25 июня 2009

Может быть, вы можете попытаться перебрать массив, возвращаемый:

Thread.currentThread().getStackTrace();
...