Печать полного стека вызовов на printStackTrace()?
Мне нужно написать небольшое приложение анализатора журналов для обработки некоторых файлов журналов, созданных третьей библиотекой закрытых исходников (с встроенным регистратором внутри), используемым в моем проекте.
В случае записи исключения в журнале мне нужно собрать агрегированную информацию о методах, связанных с трассировкой стека, от вершины до фактического места исключения.
К сожалению, по умолчанию Java printStackTrace() не печатает каждый метод в стеке вызовов, а до определенного числа, а остальное просто ссылается на 16 more...
.
Если бы я мог сам поймать исключение, я бы использовал getStackTrace() и распечатал его сам, но основная причина никогда не включалась в исключение, которое выбрала эта библиотека.
Есть ли способ попросить Java распечатать весь стек вызовов в стеке?
Помимо моей ситуации, общие рамки ведения журнала имеют для этого возможность?
Изменить: Программа работает на Sun JVM с JDK 1.5.0_09. Нет возможности изменить это.
Ответы
Ответ 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();