jueves, 4 de septiembre de 2008

Depuración remota en Tomcat con Eclipse

La depuración es muy importante en los desarrollos software. Según recuerdo, había una teoría que decía que el 50% del tiempo de desarrollo se dedica en tareas de depuración.

Si trabajas desarrollando aplicaciones web en Java y usas Tomcat como servidor de aplicaciones, este post puede ser bastante útil para tí.

Uso Eclipse para desarrollar mis aplicaciones. Normalmente aplicaciones webs. Para desarrollar y depurar suelo tener un tomcat en mi equipo (local) y mediante el plugin para Eclipse de Sysdeo puedo arrancar el tomcat desde Eclipse y depurar el código.

Sin embargo, hay ocasiones en las que por circustancias de la vida no tienes más remedio que depurar tu aplicación corriendo en algún tomcat remoto (instalado en otro equipo). En este caso tienes dos opciones:
  1. Llenar tu aplicación de mensajes de log que saquen información suficiente para poder detectar los fallos.
  2. Seguir los pasos que expongo a continuación para depurar desde Eclipse exactamente igual que si el tomcat estuviese corriendo en local.

1. Configurar Tomcat para permitir depuración remota

Para ello tan sólo basta con añadir las siguientes opciones en la variable JAVA_OPTS de tomcat. Esta variable se define en el fichero TOMCAT_HOME/bin/catalina.sh. También se puede definier en el script de inicio/parada de tomcat /etc/init.d/tomcat.

JAVA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n"

El puerto puedes poner el que quieras. Por defecto suele ser el 8000.

Por supuesto, después de cambiar la configuración hay que reiniciar tomcat.

Una vez hecho esto, tomcat tendrá abierto el puerto 8000 para que las aplicaciones externas (como Eclipse) se puedan conectar a él e intercambiar información para poder depurar el código de forma remota.

2. Depurar de manera remota con Eclipse

Abrimos Eclipse y nos vamos a Run -> Open Debug Dialog...

Hacemos click derecho en Remote Java Application y seleccionamos New... Aparecerá una ventana como la siguiente.

Debug DialogAquí tan sólo tenemos que rellenar lo siguiente:
  • Name: es el nombre de la configuración. Puedes poner lo que quieras
  • Project: pincha en el botón Browser y selecciona el proyecto que deseas depurar. Por supuesto, esa misma aplicación tiene que estar corriendo en el tomcat remoto. De aquí únicamente se tomarán los fuentes.
  • Host: ip o nombre del servidor donde está corriendo el tomcat.
  • Port: puerto que configuraste en el paso anterior.

Una vez hecho esto pulsamos en Apply y Debug. Acto seguido Eclipse conectará con el tomcat y ya podemos poner nuestro breakpoint.


Para posteriores veces podemos conectar Eclipse con nuestro tomcat tan sólo pulsando en el botón de debug y en el nombre de nuestra configuración.



Eso es todo. Simple pero muy útil. Por cierto, que no me entere que te dejas esta configuración en algún tomcat de producción, eh? Es únicamente para desarrollo y depuración. ;-)

6 comentarios:

xmanoel dijo...

Pena de no haberlo sabido antes, a ver si consigo que me funcione.

Xela dijo...

Ya verás como sí que te funciona. Es muy sencillo.

De todas formas, si no te va, coméntalo por aquí.

Anónimo dijo...

Muchas gracias!!
Me ha sido muy útil, aunque en mi caso uso tenía definida la variable:
JPDA_ADDRESS=8000
y arranco el Tomcat de la siguiente manera:
catalina jpda start

No entiendo en qué consiste, alguna idea?

Xela dijo...

Esa es otra forma igualmente válida. En lugar de añadir la variable JAVA_OPTS en el catalina.sh, hay que hacer lo siguiente:

bash$ export JPDA_ADDRESS=8000
bash$ export JPDA_TRANSPORT=dt_socket
bash$ ./bin/catalina.sh jpda start

Muchas gracias por tu aportación.

Anónimo dijo...

1. Es curioso como muchos programadores de Java no caen en la cuenta de que Tomcat o Weblogic o Websphere ... no dejan de ser, a su vez, aplicaciones Java ... y por eso se pueden depurar (en local o remoto) de la misma forma que se depuran todas las aplicaciones en Java. Es decir, que las opciones que incluimos en la variable JAVA_OPTS son exactamente las mismas que se utilizan para depurar una sencilla aplicación de una clase con un método main.

2. Como los fuentes de Tomcat están disponibles, puedes incluso depurar Tomcat (no solo el funcionamiento de tu aplicación bajo Tomcat) y ver cómo funciona por dentro ...

3. En los servidores que no ofrecen los fuentes ... siempre te quedará decompilar, solucionar los fallos, volver a compilar y reemplazar las clases originales por las generadas (esto no sé hasta qué punto es legal, pero como es para depurar ... todo vale!).

4. Si tu Tomcat se ejecuta bajo una máquina a la que únicamente tienes conexión por ssh (no directamente por telnet), siempre puedes hacer un tunel, redireccionando el puerto remoto a un puerto local y depurar Tomcat con Host=localhost y Port=puerto local.
Ejemplo de tunel: ssh host -l usuario_login -Lpuerto_local:localhost:puerto_remoto

Pinturas en Acuarela dijo...

Hola , estoy intentando depurar en remoto con tomcat 8 y con eclipse, pero no se me para en ningún punto de interrupción. La segunda vez que lo lanzo me sale
Failed to connect to remote VM. Connection refused.
Connection refused: connect

Tengo la siguiente configuracion en startup.bat --> call "%EXECUTABLE%" jpda start %CMD_LINE_ARGS%

en el fichero catalina.bat tengo JAVA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=8001,server=y,suspend=n". ¿Alguna idea de porque no se me para en ningun punto ?? y me da ese error? .Gracias