Depurar una aplicación java sin iniciar la JVM con argumentos de depuración

96

Normalmente, para adjuntar un depurador a un jvm en ejecución, necesitaría iniciar el jvm con argumentos como los siguientes:

> java -Xdebug -Xrunjdwp:transport=dt_socket,address=1000,server=y,suspend=n

Ahora, si quiero depurar un proceso que no se inició en modo de depuración, ¿qué puedo hacer?

Esta situación surge cuando un sistema de producción (es decir, iniciado sin argumentos de depuración) muestra un error "aleatorio" (uso el término libremente). Entonces no puedo reiniciar el jvm con los argumentos apropiados, porque nadie sabe cómo reproducir el error nuevamente. ¿Es imposible conectarse a la JVM en esta situación?

Solo para aclarar, no es posible usar herramientas como jdb para adjuntar a JVM que ya se están ejecutando a menos que se hayan iniciado en modo de depuración

desde la página de manual de JVM

Otra forma de utilizar jdb es adjuntarlo a una máquina virtual Java que ya se esté ejecutando. Una máquina virtual que se va a depurar con jdb debe iniciarse con las siguientes opciones:

hhafez
fuente

Respuestas:

48

Es posible que pueda usar jsadebugd ( JDK ) para adjuntar un servidor de depuración al proceso (disponible en Windows con las herramientas de depuración para Windows ). Está marcado como experimental, por lo que es posible que desee probarlo primero en una máquina de prueba.

Uso:

jsadebugd <pid>
jdb -connect sun.jvm.hotspot.jdi.SADebugServerAttachingConnector:debugServerName=localhost

El nombre del conector con arg se puede encontrar usando jdb -listconnectors.

McDowell
fuente
1
Estoy usando linux, así que esta parece ser la solución más prometedora
hhafez
¿Alguna experiencia para compartir con esto?
Thorbjørn Ravn Andersen
1
Mi experiencia es que funcionó bien las veces que lo necesité, mientras tanto, todas las instancias de fábrica del software no están configuradas para iniciarse con las opciones de depuración de jvm de forma predeterminada, por lo que podemos usar el método compatible.
hhafez
En Java 11 jsadebugdfue reemplazado por jhsdb debugd. Entonces eso se vuelve jhsdb debugd --pid <pid>. Vea las diapositivas de una charla que presenta jhsdb y los documentos para jhsdb
Delthas
Parece que también SADebugServerAttachingConnectorse eliminó jdb, y creo que se supone que el reemplazo es jhsdb hsdb/ jhsdb clhsdb. No puedo encontrar ningún documento sobre qué argumentos dar jhsdb clhsdb.
Delthas
32

Solo para aclarar que no es posible usar herramientas como jdb para adjuntar a JVM que ya están en ejecución>> a menos que se hayan iniciado en modo de depuración

en la fuente de Rusia soviética te lee

jdb -connect sun.jvm.hotspot.jdi.SAPIDAttachingConnector:pid=9426
planta en maceta
fuente
1
así que la respuesta es "compatible" pero la respuesta experimental es la que he aceptado, por lo que se puede hacer en un fasion sin soporte
hhafez
7

VisualVM no es un depurador, pero puede obtener volcados de subprocesos y volcados de montón que pueden ser útiles para diagnosticar algunos problemas. Las funciones más útiles requieren JVM 5 o 6.

sk.
fuente
el enlace no funciona ... tal vez debas eliminar el http: // antes del https: // ... lo habría hecho, pero aún no tengo la reputación suficiente
Newtopian
+1 VisualVM parece realmente interesante. Por cierto: el enlace está arreglado ahora.
sleske
5

usar jstack (útil en caso de interbloqueos) o el complemento btrace VisualVM también podría funcionar

Vijay
fuente
-5

Siempre puede usar jdb y depurar manualmente: P

OscarRyz
fuente
2
Siempre pensé que no se puede adjuntar a jvm con jdb a menos que se inicie jvm para permitir conexiones de depuración. ¿Me equivoco?
hhafez
Por lo que tengo entendido, la opción que mencionó es "habilitar" la depuración remota de su comando "java" (la VM). Pero también puede usar el comando jdb en su lugar. Entonces, en lugar de java MyApp, iría como jdb MyApp (y depuraría de forma interactiva, establecer puntos de interrupción, ejecutar, detener, mirar, etc.)
OscarRyz
1
No creo que sea correcto de acuerdo con la página de manual de jdb: comience con la cita. Otra forma de usar jdb es adjuntarlo a una máquina virtual Java que ya se está ejecutando. Una máquina virtual que se va a depurar con jdb debe iniciarse con las siguientes opciones: - end quote
hhafez
Con el conector correcto (no admitido por ahora) jdb puede conectarse a un proceso en ejecución.
Thorbjørn Ravn Andersen