Depure una aplicación Java sin iniciar la JVM con argumentos de depuración

Normalmente para adjuntar un desempate 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 se produce cuando un sistema de producción (es decir, iniciado sin argumentos de depuración) muestra un error “aleatorio” (uso el término de forma vaga). 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 aclararlo, no es posible usar herramientas como jdb para adjuntarlas a las JVM que ya se están ejecutando a menos que se hayan iniciado en modo de depuración

de la página man de JVM

Otra forma de usar jdb es adjuntándolo a una VM Java que ya se está ejecutando. Una VM que debe depurarse con jdb se debe iniciar con las siguientes opciones:

Puede utilizar jsadebugd ( JDK ) para conectar 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  jdb -connect sun.jvm.hotspot.jdi.SADebugServerAttachingConnector:debugServerName=localhost 

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

Solo para aclararlo, no es posible usar herramientas como jdb para adjuntarlas a las JVM existentes>> a menos que se hayan iniciado en modo de depuración

en la fuente soviética de Rusia te lee

 jdb -connect sun.jvm.hotspot.jdi.SAPIDAttachingConnector:pid=9426 

usar jstack (útil en caso de deadlocks) o el complemento btrace VisualVM también podrían hacer el truco

VisualVM no es un depurador, pero puede obtener volcados de hebras y volcados de heap que pueden ser útiles para diagnosticar algunos problemas. Las características más útiles requieren JVM 5 o 6.

Siempre puedes usar jdb y depurar a mano: P