JDI: Cómo pausar una aplicación Java (JVM) como en el depurador
Pregunta
Estoy buscando potencialmente una API JDI para detener el JVM en cualquier punto arbitrario durante su ejecución. Mirando a la Ruptura El método CREACEBreakPoIrCequest necesita una ubicación específica. ¿Hay alguna otra API que no necesite una ubicación o de alguna manera para obtener la ubicación actual que pueda pasar para crear un punto de interrupción?
Básicamente, estoy buscando una manera de adjuntar y pausar la aplicación, luego uso el agente JVMTI para recibir devolución de llamada para el evento de punto de interrupción para realizar un procesamiento adicional. Gracias
Solución
Los puntos de interrupción solo tienen sentido con una ubicación en la fuente. Pausa arbitraria Su aplicación probablemente se realice mejor suspendiendo todos los hilos que se ejecutan actualmente en el JVM. Echa un vistazo a SuspendThreadList()
o SuspendThread
en jvmti. Este mecanismo sería la 'pausa' que estás buscando.
Otros consejos
Si desea pausar arbitrariamente un JVM en ejecución con JDI, usaría la interfaz JDI VirtualMachine suspender método.
Sin embargo, esto realmente no le da mucho en términos de poder conectarse a un agente JVMTI; Como señala la otra respuesta, el JVMTI tiene sus propios métodos para hacer lo mismo.
Si está buscando una forma de definir devoluciones de llamada arbitrarias para los puntos de interrupción, en lugar de llamar a un agente específico, es posible que esté interesado en jdiscript, que es una capa de secuencias de comandos alrededor del JDI que te permite hacer esas cosas con bastante facilidad en Java recto, en lugar de tener que caer en C ++.
creo jdb - The Java Debugger
será la mejor opción. Por favor revise la URL sobre el jdb
http://docs.oracle.com/javase/1.3/docs/tooldocs/solaris/jdb.html