Red de conocimiento informático - Conocimiento del nombre de dominio - Desarrollar un complemento de Eclipse para depurar JSP

Desarrollar un complemento de Eclipse para depurar JSP

Este artículo muestra cómo establecer puntos de interrupción JSP en Eclipse y cómo depurar JSP de forma remota mediante el desarrollo de un complemento de editor JSP de muestra. Como conocimiento básico, las dos primeras partes de este artículo presentan los principios básicos de la depuración de JAVA y JSR-45.

Requisitos del entorno: el código de este artículo se probó en Eclipse 3.0.0, JDK1.4.2 y Tomcat 5.0.5.

Introducción al marco de depuración de Java (JPDA)

JPDA es un marco de depuración multicapa, que incluye JVMDI, JDWP y JDI. Sus herramientas de desarrollo sirven como clientes de depuración y pueden comunicarse y depurar fácilmente con máquinas virtuales. Eclipse usa JPDA para depurar aplicaciones JAVA. De hecho, todas las herramientas de desarrollo JAVA hacen esto. SUN JDK también viene con ejemplos y una herramienta de depuración relativamente simple.

JVMDI define la interfaz local que la máquina virtual necesita implementar

JDWP define el protocolo de comunicación entre la JVM y el cliente de depuración

El cliente de depuración y el JVM puede En la misma máquina, también es posible la depuración remota. El JDK incluye una implementación predeterminada de jdwp.dll, lo que permite la flexibilidad de utilizar otros protocolos en lugar de JDWP. SUN JDK tiene dos métodos de transmisión de protocolos de comunicación: socket y memoria habilitada para **** (esta última solo está disponible para Windows), generalmente usamos sockets.

Puedes iniciar la JVM en modo de depuración usando los siguientes parámetros

-Xdebug -Xnoagent -Xrunjdwp: transport=dt_socket, dirección=8000, server=y, suspend=n -Xrunjdwp JVM carga jdwp.dll transport=dt_socket, dirección=8000, server=y, suspend=n -Xrunjdwp JVM carga jdwp.dll transport=dt_socket Utilice la dirección de transporte del socket para representar el número de puerto de depuración server=y significa que la JVM actúa como un servidor y establece un socket La palabra suspender=n significa que durante el inicio, la JVM no se bloqueará esperando a que el cliente de depuración se conecte

JDI es un conjunto de interfaces JAVA

Si es un cliente de depuración JAVA, solo necesita implementar la interfaz JDI y usar el protocolo JDWP para comunicarse con la máquina virtual, y luego puede llamar a JVMDI.

La siguiente figura muestra la arquitectura básica de JPDA:

Componentes Interfaz del depurador / |--------------------- - -| / | VM | depurado ----( |-----------------------| ------- JVMDI - Depuración de VM Java Interfaz

| back-end |

|----------------------| canal de comunicación - ( | --)------------- JDWP - Protocolo de conexión de depuración de Java

| - ---| | Interfaz de usuario de Java |------------| -- ------------------|

Eclipse, como cliente de depuración basado en JAVA, proporciona JDI utilizando org.eclipse.jdt Complemento .debug La implementación específica de la interfaz JDI incluye principalmente los siguientes cuatro paquetes

com.sun.jdi com.sun.jdi.connect com.sun.jdi.event com.sun.jdi.request

Este artículo no profundiza en JDI, sino que se centra en las interfaces relacionadas con puntos de interrupción en JDI

com.sun.jdi

Principalmente subprocesos JVM (VirtualMachine) ( ThreadReference) pila de llamadas (StackFrame) y descripción de tipos e instancias. Usando este conjunto de interfaces, el cliente de depuración puede obtener todos los tipos definidos y llamar dinámicamente a los métodos de la clase de una manera similar a la reflexión de clase. p> El evento com.sun.jdi.event

encapsula los eventos generados por la JVM y la JVM notifica al cliente de depuración sobre estos eventos. Por ejemplo, BreakpointEvent es un evento emitido por la JVM cuando. alcanza un punto de interrupción y ClassPrepareEvent es cuando se carga una clase

com.sun.jdi.request

Encapsula las solicitudes que el cliente de depuración puede enviar a la JVM. BreakpointRequest envía una solicitud a la JVM para agregar un punto de interrupción; ClassPrepareRequest registra una solicitud de carga de clase con la JVM, que emitirá el evento ClassPrepareEvent cuando se cargue la clase especificada.

Especificación JSR-45

JSR-45 (Soporte de depuración para otros lenguajes) proporciona un mecanismo estándar para depurar programas escritos en lenguajes distintos de Java que deben compilarse en Java. codificar y ejecutar en JVM. Quizás el significado literal sea un poco difícil de entender. ¿Qué es un lenguaje que no es Java? De hecho, JSP es un buen ejemplo y el ejemplo JSR-45 es un JSP.

La depuración de JSP siempre se ha basado en la implementación de un servidor de aplicaciones específico y no existe un modelo unificado que proporcione un modelo estándar para esta situación. Sabemos que la depuración de JAVA utiliza principalmente números de línea como marcadores para el posicionamiento.

Pero después de compilar JSP en código JAVA, el número de línea JAVA y el número de línea JSP no pueden corresponder uno a uno.

JSR-45 estipula esto: después de compilar JSP en código JAVA, se genera al mismo tiempo una tabla (SMAP) correspondiente al nombre del archivo JSP y el número de línea y el número de línea JAVA. solicitud de depuración del cliente, de acuerdo con la tabla correspondiente (SMAP), el número de línea de JSP se convierte al número de línea del código JAVA antes de que la JVM envíe la notificación del evento, y también se convertirá del número de línea de JSP; al número de línea del código JAVA de acuerdo con la tabla correspondiente (SMAP) antes de emitir una notificación de evento, la JVM también convertirá el nombre del archivo JSP y el número de línea de acuerdo con la tabla correspondiente (SMAP) y notificará directamente al cliente de depuración del nombre del archivo JSP y el número de línea.

Hicimos una prueba usando Tomcat 5.0. Hay dos JSP, Hello.jsp y Greeting.jsp. El primero contiene el segundo. Tomcat los compilará en código JAVA (Hello_jsp.java), clase JAVA (Hello_jsp.class) y clase JAVA (Hello_jsp.class), así como una tabla de mapeo (SMAP) entre nombres de archivos/números de línea JSP y números de línea JAVA.

Hola.jsp:

1 2 3 4 5 6 7 8

saludo.jsp: 1 ¡Hola! 2 Adiós

El Hello_jsp.java generado por la compilación JSP es el siguiente: Hello_jsp.java: 1 paquete org.apache.jsp; 2 3 import javax.servlet.* 4 import javax.servlet.jsp; 5 importar javax.servlet.jsp; 6 importar javax.servlet.jsp. canal m -( | --------------- JDWP - Protocolo de conexión de depuración de Java

| |--------- ------ ------| | Interfaz de usuario | ------------------------- JDI - Interfaz de depuración de Java | UI | ---------------------|

Eclipse Como cliente de Eclipse basado en la depuración de JAVA, se proporciona mediante org. Complemento eclipse.jdt.debug La implementación específica de JDI La interfaz JDI incluye principalmente los siguientes cuatro paquetes: com.sun.jdi com.sun.jdi.connect com.sun.jdi.event com.sun.jdi.request

Este artículo no proporciona JDI La implementación específica. p> Este artículo no profundiza en JDI. Aquí nos centramos en las interfaces relacionadas con JDI y los puntos de interrupción. (VirtualMachine) pila de llamadas de subprocesos (ThreadReference) (StackFrame) y tipos e instancias. Usando este conjunto de interfaces, el cliente de depuración puede obtener todas las definiciones de tipos y llamar dinámicamente a los métodos de la clase de una manera similar a la reflexión de clase. .jdi.event encapsula los eventos generados por la JVM y la JVM notificará al depurador sobre estos eventos.

Por ejemplo, BreakpointEvent es un evento emitido cuando la JVM alcanza un punto de interrupción; ClassPrepareEvent es un evento emitido cuando se carga una clase. com.sun.jdi.request encapsula las solicitudes que el cliente de depuración puede realizar a la JVM. Por ejemplo, BreakpointRequest inicia una solicitud a la JVM para agregar un punto de interrupción; ClassPrepareRequest registra una solicitud de carga de clases con la JVM, y la JVM emitirá un evento ClassPrepareEvent cuando se cargue la clase especificada.

Especificación JSR-45

JSR-45 (Soporte de depuración para otros lenguajes) proporciona un mecanismo estándar para depurar código escrito en lenguajes que no son JAVA y que debe compilarse en Java. y ejecute el programa en la JVM. Quizás el significado literal sea un poco difícil de entender. ¿Qué es un lenguaje que no es JAVA? De hecho, JSP es un buen ejemplo y el ejemplo JSR-45 es un JSP.

La depuración de JSP siempre se ha basado en la implementación de un servidor de aplicaciones específico sin un modelo unificado. JSR-45 proporciona un modelo estándar para esta situación. Sabemos que la depuración de JAVA utiliza principalmente números de línea como marcadores para el posicionamiento. Pero después de compilar JSP en código JAVA, el número de línea JAVA y el número de línea JSP no pueden corresponder uno a uno.

JSR-45 estipula esto: después de compilar JSP en código JAVA, se genera al mismo tiempo una tabla (SMAP) correspondiente al nombre del archivo JSP y el número de línea y el número de línea JAVA. solicitud de depuración del cliente, de acuerdo con la tabla correspondiente (SMAP), el número de línea de JSP se convierte al número de línea del código JAVA antes de que la JVM envíe la notificación del evento, y también se convertirá del número de línea de JSP; al número de línea del código JAVA de acuerdo con la tabla correspondiente (SMAP No.) Antes de emitir una notificación de evento, la JVM también convertirá el nombre del archivo JSP y el número de línea de acuerdo con la tabla correspondiente (SMAP) y notificará directamente al cliente de depuración del nombre del archivo JSP y el número de línea.

Hicimos una prueba usando Tomcat 5.0. Hay dos JSP, Hello.jsp y Greeting.jsp. El primero contiene el segundo. Tomcat los compila en código JAVA (Hello_jsp.java), clase JAVA (Hello_jsp.class) y clase JAVA (Hello_jsp.class), así como una tabla de mapeo (SMAP) entre nombres de archivos/números de línea JSP y números de línea JAVA.

Hola.jsp: 1 2 3 4 5 6 7 8

saludo.jsp: 1 ¡Hola! 2 Adiós

El Hello_jsp.java generado por la compilación JSP es el siguiente: Hello_jsp.java: 1 paquete apache.jsp 2 3 import javax.servlet.*; .*; 5 import javax.servlet.jsp.*; 6 7 clase final pública Hello_jsp extiende org.apache.jasper.runtime.JspSourceDependent { 9 10 dependientes java.util privados estáticos; util.Vector (1); 14 _jspx_dependants.add("/greeting.jsp"); 15 }16 17 public java.util.List getDependants() { 18 return _jspx_dependants; respuesta) 22 lanza java.io.IOException, ServletException { 23 24 JspFactory _jspxFacto.