Pregunta

Recientemente he encontrado un fallo que provoca una NullPointerException. La excepción se detecta y se registra mediante un comunicado 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 se puede ver, nada de lujos. Sin embargo, de todas las declaraciones de registro de excepción que tenemos, sólo por esta no se 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 es cargado ligeramente, pensé que tal vez no es una cuestión de reordenamiento de instrucciones de algún tipo y decidió llamar e.getStackTrace () antes de la declaración de registro. Esto hizo ninguna diferencia.

Así que decidí reiniciar con el agente de depuración habilitada. Sin embargo, debido a que incluso adjuntado al proceso, he notado que ahora los seguimientos de pila se imprimen. Tan claramente la presencia del agente de depuración causado alguna información adicional de depuración que estén disponibles.

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

Aclaración: esto no es un problema de la tala . Imagínese el mismo bloque try / catch, pero en la captura, imprimo el valor de:

e.getStackTrace().length

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

Más información: esto está sucediendo en JDK 1.6.0_13 de 64 bits en AMD64, Linux 2.6.9

¿Fue útil?

Solución

¿Es posible que este código está en un bucle interno? A continuación, a continuación, compilador JIT puede estar recopilando la pila de llamadas para este a código nativo, la pérdida de la información de la pila. A continuación, cuando se instala el depurador se deshabilita el JIT, por lo que la información disponible de nuevo.

Las otras excepciones manuales siguen mostrando la información como el JIT no es la optimización.

Parece que esto a veces puede suceder por otros de un comentario en el código fuente de la clase en la línea 102:

http: //logging.apache. org / log4j / 1,2 / xref / org / apache / log4j / SPI / LocationInfo.html

Otros consejos

Con la bandera de JVM -XX: -OmitStackTraceInFastThrow puede desactivar la optimización del rendimiento de la máquina virtual Java para este caso de uso. Si se da este parámetro, que desactiva la bandera, el StackTrace estará disponible.

Para obtener más información, echar un vistazo a las siguientes notas de la versión:

"El compilador en el servidor de VM proporciona ahora trazas de pila correctos para todos 'en frío' incorporada excepciones. Por motivos de rendimiento, cuando tal excepción se lanza un par de veces, el método puede volver a compilar. Después de recompilación, el compilador . puede elegir una táctica más rápido el uso de excepciones preasignados que no proporcionan un seguimiento de pila Para desactivar completamente el uso de excepciones preasignados, utiliza esta nueva bandera: -XX: -OmitStackTraceInFastThrow ". http://java.sun.com/j2se/1.5.0/relnotes.html

puedo replicar esta pero parece un poco raro que esto estaría sucediendo en su acción alguna parte.

Si llama setStackTrace con una matriz vacía, que le causa sólo el texto que se mostrará.

 public class Fark {
   public static void main(String[] args) {
       try {
           Fark.throwMe(args.length != 0);

       }
       catch (Exception e) {
           e.printStackTrace();
       }

   }

     public static final void throwMe(boolean arg) throws Exception{
         Exception e = new NullPointerException();
         if (arg) {
           e.setStackTrace(new StackTraceElement[0]);
         }
         throw e;
     }
 }

Al ejecutarlo ....

% java Fark
java.lang.NullPointerException
        at Fark.throwMe(Fark.java:15)
        at Fark.main(Fark.java:5)

% java Fark nothing
java.lang.NullPointerException
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top