Pregunta

Necesito escribir una pequeña aplicación de analizador de registros para procesar algunos archivos de registro generados por una biblioteca de código cerrado de terceros (que tiene un registrador personalizado dentro) utilizada en mi proyecto.

En caso de una entrada de excepción en el registro, necesito recopilar información agregada sobre los métodos involucrados a lo largo del seguimiento de la pila desde la parte superior hasta el lugar real de la excepción.

Desafortunadamente, por defecto Java printStackTrace () no imprime todos los métodos en la pila de llamadas, sino hasta un cierto número y el resto solo se hace referencia como 16 más ... .

Si pudiera detectar la excepción yo mismo, usaría getStackTrace () e imprimirlo yo mismo, pero la causa raíz nunca se incluye en la excepción que arroja esta biblioteca.

¿Hay alguna manera de pedirle a Java que imprima toda la pila de llamadas en el stacktrace?

Además de mi situación, ¿los marcos de registro comunes tienen una opción para esto?

Editar: el programa se ejecuta en JVM de Sun con JDK 1.5.0_09. No hay opción para cambiar eso.

¿Fue útil?

Solución

aquí hay una explicación del 'causado por 'y' ... n más 'líneas en la traza impresa. vea también el JavaDoc para printStackTrace . es posible que no tengas trabajo que hacer.

  

Tenga en cuenta la presencia de líneas que contienen los caracteres " ... " ;. Estas líneas indican que el resto de la traza de la pila para esta excepción coincide con el número indicado de fotogramas desde la parte inferior de la traza de la pila de la excepción causada por esta excepción (la excepción "adjunta"). Esta taquigrafía puede reducir en gran medida la longitud de la salida en el caso común en el que se lanza una excepción envuelta desde el mismo método que la "excepción causal". está atrapado.

Otros consejos

¿No puedes hacer algo con Thread.currentThread (). getStackTrace () ?

Aquí hay un ejemplo muy simple que llama a un método de forma recursiva 20 veces y luego descarga la pila del hilo actual.

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();
        }
    }
}

Puede ser que pueda intentar iterar sobre la matriz devuelta por:

Thread.currentThread().getStackTrace();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top