2011-08-29 5 views
6

¿Hay alguna forma de agregar información adicional a la pila stack de Java?Agregue información especificada por el usuario a los rastreos de la pila Java

Estoy desarrollando un intérprete para un lenguaje de script y me gustaría ver las líneas correspondientes de código de script en la pila de Java.

La salida podría ser algo como esto:

java.lang.NullPointerException 
at package.IPF_Try.execute(IPF_Try.java:76) called in script.scr:155 
at package.IPF_Block.execute(IPF_Block.java:304) 
at package.IPF_If.execute(IPF_If.java:105) called in script.scr:130 
at package.IPF_Block.execute(IPF_Block.java:304) 
at package.IPF_Main.execute(IPF_Main.java:147) 
... 

o esto:

java.lang.NullPointerException 
at package.IPF_Try.execute(IPF_Try.java:76) 
    --- called in script.scr:155 --- 
at package.IPF_Block.execute(IPF_Block.java:304) 
at package.IPF_If.execute(IPF_If.java:105) 
--- called in script.scr:130--- 
at package.IPF_Block.execute(IPF_Block.java:304) 
at package.IPF_Main.execute(IPF_Main.java:147) 
... 

Esto haría que la depuración mucho más fácil, por desgracia, Google no pudo encontrar nada para lograrlo.

La única forma en que podía pensar era generar dinámicamente un montón de clases con métodos, cuyo nombre contiene la información que necesito y que simplemente llama al siguiente método en la pila, pero parece una pérdida de (permgen) memoria y cpu ciclos para mí.

+0

Interesante pregunta. El compilador de Java coloca símbolos de depuración con nombres de archivos y números de línea en el bytecode. Supongo que si te equivocaste con el bytecode, podrías ajustarlo para que se ajuste mejor a tus necesidades. ¿Los compiladores JSP están haciendo algo así? – Thilo

+0

@Thilo - yes - Las JSP se compilan en bytecode (a veces usando un formulario intermedio de Java); En general, puede encontrar las clases compiladas dando vueltas alrededor de los directorios "en funcionamiento" de su servidor. – McDowell

+0

el problema es que no puedo simplemente meterme con el bytecode de mis métodos, porque se llaman desde varios scripts, por lo que no puedo agregarle una información específica. Sin embargo, podría crear dinámicamente algunas clases que contengan la información necesaria en los nombres de sus métodos o similar, pero me preocupan las implicaciones de rendimiento. – ChristophK

Respuesta

1

Si traduce sus scripts a bytecode, puede proporcionar detalles de depuración utilizando los atributos SourceFile y LineNumber.

No conozco un mecanismo para inyectar información en la pila de llamadas en tiempo de ejecución.

+0

eso está muy mal, gracias por la referencia en SourceFile y Linenumber-Attributes. Tal vez tenga que generar clases después de todo, sin embargo, dado que necesitaré una clase por archivo y por número de línea, esto significaría generar varios miles de clases ficticias ... – ChristophK

+0

@ChristophK, ¿por qué necesita una clase por línea? ¿Podría usar una clase por rutina/sección en su secuencia de comandos en su lugar? – jelford

+0

que puede funcionar, sin embargo, experimenté un poco con la creación de "clases ficticias", e incluso unos pocos miles parecen usar bastante espacio de generación permanente. – ChristophK

Cuestiones relacionadas