2010-08-28 21 views
47

Me gustan mucho las instalaciones de depuración remota de la JVM. Pero me pregunto cómo funciona internamente.Depuración remota de Java, ¿cómo funciona técnicamente?

Mi hipótesis: se realiza a través de una función JVM donde el proceso se está descargando/usando el código fuente del depurador remoto adjunto (como IDE) Conoce la línea del stack-trace actual y luego puede saltar al respectivo punto de corte IDE. La comunicación del seguimiento de la pila y la introspección del estado de la aplicación se realiza a través de sockets o memoria compartida (configuración del depurador remoto).

¿Alguien tiene enlaces/recursos interesantes sobre eso?

Respuesta

35

Las funciones de depuración de la JVM se proporcionan a través del Java Platform Debugger Architecture (JPDA).

El propio JPDA se compone de los siguientes:

  • interfaz Java Virtual Machine Tool (JVM TI) - la interfaz de programación nativo para herramientas a utilizar. Esta interfaz permite la inspección del estado y ayuda a controlar el flujo de ejecución dentro del depurador.
  • Java Debug Wire Protocol (JDWP): se utiliza para definir la comunicación entre los procesos de depuración y depuración.
  • Java Debug Interface (JDI): esta interfaz permite a los desarrolladores de herramientas escribir aplicaciones remotas de depuración.

El diagrama enumerado en JPDA architecture structure es un buen punto de partida. Lugares adicionales para buscar sería el guides listed in the JPDA page.

+0

Gracias, fue una lectura que vale la pena. Solo por interés, intentaré usar la biblioteca jdi.jar para ver directamente la depuración en acción. –

+2

@manuel, si tiene tiempo y paciencia, eche un vistazo al código fuente de JSwat (http://code.google.com/p/jswat/). Está construido sobre la plataforma Netbeans, y sirve como una aplicación de front-end en lo que respecta a JPDA. Debo admitir que no he investigado las fuentes. –

9

La arquitectura de depuración de Java se llama JPDA. Probablemente quiera leer el JPDA documentation. En particular, el Walk-through section da un ejemplo de una interfaz IDE con la JDI para obtener un valor en la pila.

7

La depuración de Eclipse comienza con lo que se conoce como Agentes.

La JVM, que ejecuta las fuentes ".class" compiladas, tiene una característica que permite que bibliotecas externas (escritas en Java o C++) sean inyectadas en la JVM, durante el tiempo de ejecución. Estas bibliotecas externas se denominan Agentes y tienen la capacidad de modificar el contenido de los archivos .class que se han ejecutado. Estos agentes tienen acceso a la funcionalidad de la JVM a la que no se puede acceder desde un código Java común que se ejecuta dentro de la JVM y se pueden usar para hacer cosas interesantes como inyectar y modificar el código fuente, el perfil, etc. Algunas herramientas como JRebel (utilizada para el reemplazo en caliente del código) hace uso de esta funcionalidad para lograr su magia.

Y para pasar una Lib agente a una JVM, lo hace a través de argumentos de puesta en marcha, usando el -

agentlib:libname[=options] 

En realidad estábamos pasando un Agente Lib jdwp llamado a la JVM que ejecuta Tomcat. El jdwp es una implementación JVM específica y opcional del JDWP (Java Debug Wire Protocol) que se utiliza para definir la comunicación entre un depurador y una JVM en ejecución. Su implementación, si está presente, se proporciona como una biblioteca nativa de la JVM como jdwp.so o jdwp.dll

Entonces, ¿qué hace? En términos simples, el agente jdwp que pasamos básicamente cumple la función de ser un enlace entre la instancia de JVM que ejecuta una aplicación y un depurador (que puede ubicarse remota o localmente).Dado que es una Biblioteca de agentes, tiene la capacidad de interceptar el código en ejecución, crear un puente entre la JVM y un depurador, y tener la funcionalidad de un depurador aplicado en la JVM. Dado que en la arquitectura JVM, la funcionalidad de depuración no se encuentra dentro de la propia JVM pero se abstrae en herramientas externas (que se denominan depuradores), estas herramientas pueden residir en la máquina local ejecutando la JVM que se está depurando o ejecutando desde una máquina externa. Es esta arquitectura modular desacoplada la que nos permite tener una JVM ejecutándose en una máquina remota y usando el JDWP, tener un depurador remoto capaz de comunicarse con ella.

Así es como funciona el depurador Eclipse.

+1

En realidad, entiendo los fundamentos de los agentes de JVM. Pero no está claro cuando el desarrollador puso un punto de interrupción en alguna línea en eclipse, ¿cómo funciona? ¿También es necesario compilar el código en el buzón local para depurar la aplicación remota remota? –

Cuestiones relacionadas