2008-12-16 10 views
8

Me preguntaba si existe algo (en el mundo Java) capaz de tomar una instantánea del estado actual JVM con las siguientes características:automatizado de excepciones de manipulación

  • hacerlo mientras una excepción está siendo lanzada.
  • Captura de variables locales, argumentos del método, etc.
  • Colóquelo en un archivo útil que pueda usarse para extraer o reproducir en un IDE la situación en su código fuente.

Se requieren las dos primeras características (la tercera sería increíble). Y debe ser adecuado para el uso de producción (por lo tanto, no hay forma de eliminar errores).

Antes de hacer esta He buscado a través de la WWW (el mayor tiempo posible) y me di algunos consejos:

  • Cajoon Interceptor: Como se ha dicho en Dzone post, que es un agente JVM pasiva que cumple los tres requisitos! Pero tiene dos desventajas: debe pagar y el sitio está caído (tal vez no hay posibilidad de pagar nada).
  • AviCode Intercept Studio: equivalente .NET de Cajoon. Solo para dar una idea acerca de.
  • JavaFrame: Ok, es un tweet, pero apunta a un repositorio SVN disponible que tiene el código fuente (bajo licencia MIT) de un agente JVM que se ve bien (voy a intentarlo).

Entonces, ¿tal vez estoy buscando una solución inexistente? No es urgente, pero tenía esta idea para un proyecto y sería genial explorar este camino "desconocido" (?) Y obtener algo real.

Parece estar claro que sería un agente JVM (evento de excepción de JVMTI, para example).

Por último, me gustaría destacar el párrafo followin de Wikipedia's Exception Handling article:

En entornos de tiempo de ejecución del motor como Java o .NET, existen herramientas que sujetan al motor de tiempo de ejecución y cada vez que un Se produce la excepción de interés , registran la depuración información que existía en la memoria en el momento en que se produjo la excepción (pila de llamadas y valores de montón). Estas herramientas se denominan Excepción automatizada Herramientas de manipulación o interceptación de errores y proporcionan información de 'causa raíz' para conocer las excepciones.

Esa es la idea. Espero que alguien me pueda dar alguna información o tal vez, en el futuro, alguien se inspire en esta humilde publicación :)

¡Gracias!

+0

Tengo curiosidad por saber si se han encontrado otras soluciones. – dsatish

Respuesta

2

Echo un vistazo a JavaFrame y parece un buen punto de partida. Sólo tiene que instalar Apache Ant, hacer ant en el directorio javaframe y poner en marcha el conjunto de pruebas (dentro del directorio de prueba) con:

LD_LIBRARY_PATH=../build/native/ java -agentlib:frameintrospect -classpath ../build/classes/:. org.thobe.frame.Test 

No puede ser cualquier variable local, pero se trata. Entonces, como dije, puede ser un punto de partida. Espero llegar más lejos sobre su uso, pero no hay tiempo ni documentación (hay muchos proyectos llamados JavaFrame) que son malas circunstancias.

Quizás algún día se pueda volver a hacer. Si de nuevo. Estaba Cajoon, parecía prometedor y brillante, pero su sitio web está inactivo y no hay rastros de ningún tarro descargable para probar.

¡Gracias a todos!

PD .: Sólo como referencia, algunos enlaces que encontré mientras investigaba:

0

No estoy seguro si esto es viable en un entorno de producción, pero no es el depurador Omnisciente:

¿Qué pasa si el depurador podría ir "ir hacia atrás en el tiempo?" ¿Eso haría que la depuración sea más fácil? Simplemente registrando todas las asignaciones de variables, es posible hacer esencialmente esto.Esta es la idea subyacente para la depuración omnisciente. La parte asombrosa es que los programas significativamente grandes se pueden depurar de esta manera: Ant, JUnit, el propio depurador.

http://www.lambdacs.com/debugger/

+0

Lo encontré también, pero no creo que pueda ser una solución adecuada para un entorno de producción, ya que parece necesitar ejecutar a través de él su programa. Imagínelo con un JBoss AS ... Gracias de todos modos;) – Dario

1

Es posible que desee ver en el trabajo que NetBeans ha hecho con respecto al uso automatizado de registro: http://wiki.netbeans.org/UsageLoggingSpecification.

En cuanto a la eliminación de variables locales, me imagino que simplemente podría usar un depurador, como el mencionado por bajafresh4life.

+0

Gracias, hay una manera de llamar a un depurador al manejar una excepción? El objetivo es obtener una imagen del estado de JVM sobre la marcha, justo en el momento en que se produce una excepción. De esta manera, usted podría ver qué valores tenían las variables locales, también las clases estáticas y los argumentos del método también. – Dario

1

¿Quizás podría hacerse con AspectJ?

+0

Tal vez, pero no hay volcado de variables locales disponibles, supongo, porque los aspectos tienen su propio alcance o contexto (tal vez estoy equivocado). – Dario

Cuestiones relacionadas