El seguimiento de la pila NullPointerException no está disponible sin el agente de depuración

Recientemente he encontrado un error que causa una excepción NullPointerException. La excepción se captura y se registra mediante una instrucción slf4j estándar. Código abreviado a continuación:

for(Action action : actions.getActions()) {
    try {
        context = action.execute(context);
    } catch (Exception e) {
        logger.error("...", e);
        break;
    }
}

Como puedes ver, nada de lujos. Sin embargo, de todas las declaraciones de registro de excepciones que tenemos, solo esta no imprime un seguimiento de pila. Todo lo que se imprime es el mensaje (representado como "...") y el nombre de la clase de excepción (java.lang.NullPointerException).

Dado que el seguimiento de la pila en una excepción está cargado de forma perezosa, pensé que tal vez hay un problema de reordenación de instrucciones de algún tipo y decidí llamar a e.getStackTrace () antes de la declaración de registro. Esto no hizo ninguna diferencia.

Así que decidí reiniciar con el agente de depuración habilitado. Sin embargo, debido a que incluso me vinculé al proceso, noté que ahora se estaban imprimiendo los rastros de la pila. Así que claramente la presencia del agente de depuración causó que cierta información de depuración adicional estuviera disponible.

Desde entonces he arreglado la causa raíz de la excepción. Pero me gustaría saber por qué el seguimiento de pila no estaba disponible sin un depurador. ¿Nadie sabe?

Aclaración:Esto no es un problema de registro. Imagine la misma cláusula try / catch, pero en el catch, imprimo el valor de:

e.getStackTrace().length

Sin un depurador, esto imprime '0', con un depurador imprime un número positivo (9 en este caso).

Más información: esto está sucediendo en JDK 1.6.0_13, 64bit, amd64, linux 2.6.9

Respuestas a la pregunta(3)

Su respuesta a la pregunta