2008-11-24 15 views
8

¿Es posible tener una sesión de depuración post-mortem (o post-excepción) en Java? ¿Cuáles serían las soluciones (si todavía no hay una solución para esto)?¿Depuración post-mortem de Java?

Respuesta

4

puede adjuntar el depurador a un proceso de Java y establecer un punto de interrupción cuando se recibe una excepción específica. ¿Esto es lo que necesitas?

De http://java.sun.com/j2se/1.5.0/docs/tooldocs/solaris/jdb.html

Cuando se produce una excepción para los que no hay una relación de capturas en cualquier lugar hasta la pila de un programa Java, el tiempo de ejecución de Java normalmente vuelca una traza y salidas excepción . Cuando se ejecuta bajo jdb, sin embargo, que excepción es tratada como una no recuperable punto de interrupción, y jdb se detiene en la instrucción infractor. Si esa clase fue compilado con la opción -g, variables de instancia y locales pueden ser impresa para determinar la causa de la excepción.

Este tipo de puntos de interrupción se puede configurar con cualquier IDE, como Eclipse. Usando eclipse también puede establecer un punto de interrupción en un tipo de excepción específico, incluso si está atrapado en el código normal.

Si tiene algo así como un servidor multiproceso en ejecución, y uno de los subprocesos que da servicio a un cliente arroja una excepción no controlada, entonces podría verificar el depurador y ver qué pasa. No creo que esto sea algo para producción, pero definitivamente ayuda cuando se prueba.

La aplicación no tiene que ejecutar desde el depurador, pero puede ser lanzado con las opciones de depuración como argumentos:

-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=XXXX 

La aplicación se ejecuta normalmente, pero cambia al modo "interpretado" cuando un punto de interrupción es éxito, al menos en las versiones más modernas de la JVM. Entonces el rendimiento no se ve afectado.

Consulte la sección sobre full-speed debugging for HotSpot VM

velocidad completa depuración

La máquina virtual Java HotSpot ahora utiliza depuración de máxima velocidad. En la versión anterior de la VM, cuando la depuración era habilitada, el programa ejecutado usando solo el intérprete. Ahora, la completa ventaja de rendimiento de la tecnología HotSpot está disponible para los programas, incluso con código compilado. El rendimiento mejorado de permite depurar más fácilmente los programas de larga ejecución . También permite que las pruebas procedan al a velocidad máxima. Una vez que hay una excepción , el depurador se inicia con visibilidad total de las fuentes de código.

+0

Lo que pasa es que mi aplicación se ejecutará durante un periodo indeterminado de tiempo, y si se va a lanzar una excepción, me gustaría depurar. El problema es que si ejecuto la aplicación en el depurador, el rendimiento se degradará. – Geo

+0

He ampliado la información sobre la depuración a toda velocidad. –

+0

Hola Mario, parece que tienes experiencia con la conexión de jdb a un proceso en ejecución ... ¿Serías capaz de responder mi pregunta aquí ...http: //stackoverflow.com/questions/28528325/attach-jdb-on-uncaught-exception ....Gracias. – nave

4

Por lo que sé, tendrías que esperar a Java 7 para obtener una API oficial - ver http://tech.puredanger.com/java7#jsr326.

Mientras tanto, puede sustituir Exception (reemplace la clase base, inyectar el código a través de la instrumentación, etc.) para conservar sus datos. Tenga en cuenta que el ClassLoader arroja y captura ClassNotFoundException regularmente (cada nuevo paquete cargado). Tendrás mucho control de esa manera sin tener que modificar tu código base.

+0

Si bien hay muchas palabras en común, JSR 326 no responde (AFAIK) a la pregunta que se hizo. Más bien, establece formatos estándar y herramientas para leer artefactos producidos a partir de programas Java (volcados de pila, rastreos de pila, etc.). No veo cómo eso te permitirá depurar la autopsia. –

+0

@alex Debo haber asumido que al "depurar post moretem" Charade significaba pasar por el montón/obtener un seguimiento preciso de pila antes de la muerte de jvm. Tienes razón, realmente no responde la pregunta. –

+0

Probablemente significó exactamente como en Python, donde simplemente puede llamar a ['import pdb; pdb.pm() '] (https://docs.python.org/2/library/pdb.html) después de cualquier excepción. Muy útil para la depuración. –

4

Soy un arquitecto de soluciones para soluciones de reproducción. Proporcionan una "máquina del tiempo" para aplicaciones Java. Puede grabar una aplicación mientras se está ejecutando (digamos, en un entorno de control de calidad) y luego reproducir la grabación en su máquina de desarrollo. No necesita acceder a la base de datos, configuraciones, etc. Todo lo que necesita es su solución ReplayDIRECTOR y puede solucionar el problema en los confines de su IDE. Los problemas que se pueden reproducir varían desde problemas de configuración, excepciones de base de datos hasta problemas de subprocesamiento. Echar un vistazo:

http://www.replaysolutions.com

+0

Voy a echar un vistazo tan pronto como regrese del trabajo. – Geo

Cuestiones relacionadas