Blog tecnico

Blog técnico

 

 

Cómo depurar aplicaciones remotas en Eclipse

Cómo depurar aplicaciones remotas en Eclipse

Eclipse

Cuando nos encontramos con un comportamiento extraño en una aplicación, que ofrece una salida distinta de lo que esperábamos, una buena forma de encarar el problema para poder solucionarlo rápidamente es depurar el código fuente (en inglés, a este proceso se le conoce como debugging). Depurar el código significa ejecutarlo de forma controlada, en modo depuración, de forma que podamos detener la ejecución en el punto (o puntos) que nos interese para ver qué es lo que está pasando: valores de las variables, resultados de determinados métodos, memoria ocupada, etc., y determinar por qué la aplicación se comporta del modo indeseado.

 

Para realizar esta tarea, lo normal es apoyarse en las características del entorno de desarrollo (IDE, por las siglas del término en inglés: integrated development environment), puesto que todos prácticamente vienen con algún mecanismo de depuración incorporado. En éticco solemos utilizar Eclipse, uno de los IDEs más populares en todo el mundo aunque, como veremos, la mitad del trabajo, es decir, activar la depuración en el servidor de aplicaciones, es independiente del entorno de desarrollo.

 

En Eclipse se pueden ejecutar, y por tanto depurar, diferentes tipos de código, dentro del propio Eclipse: depurar una aplicación standalone, realizar pruebas con clases de JUnit, ejecutar código sobre un Tomcat enganchado a Eclipse, etc. Sin embargo, en este tutorial vamos a ver cómo depurar una aplicación ejecutada en un servidor de aplicaciones remoto no controlado por Eclipse. Esto es algo muy habitual en éticco puesto que, tanto en el equipo local de los programadores como en los entornos de integración y preproducción, solemos utilizar máquinas virtuales con servidores de aplicaciones sobre los que desplegamos aplicaciones web (es decir, desplegamos wars sobre Tomcat, JBoss, etc. corriendo, por ejemplo, sobre una máquina de VirtualBox con Debian).

 

La configuración de un entorno de depuración de una aplicación web java consiste en dos partes prácticamente independientes:

 

- Por una parte, activar la depuración en el servidor de aplicaciones. Esta parte es independiente del IDE que usemos y será diferente (aunque similar) para cada servidor de aplicaciones.

- Por otra, configurar el IDE para que se conecte al servidor de aplicaciones para depurar el código. Esta parte es independiente del servidor de aplicaciones que usemos y será diferente para cada IDE.

 

Vamos a empezar por esta segunda parte, configurar el IDE, que es la más sencilla, aunque lógicamente esto habrá que hacerlo después de haber activado la depuración en el servidor de aplicaciones (de lo contrario, el IDE no podrá conectar con él).

 

Configuración de Eclipse para depurar una aplicación Java remota

 

Para depurar en Eclipse, se puede pinchar sobre la flecha situada a la derecha del icono del "bicho" y seleccionar "Configuraciones de depuración".

 

Configuraciones de Depuración

 

En la pantalla que se abre, a la izquierda pulsamos con el ratón sobre "Aplicaciones Java remotas" y después en el icono de "Nueva configuración". En la parte derecha se muestra entonces la información que debemos rellenar: nombre que le queremos dar a esa configuración de depuración, el proyecto que vamos a depurar (podemos navegar al proyecto que queramos) y, lo más importante, en la parte de abajo aparecen dos campos en los que debemos insertar el host y el puerto al que se debe conectar Eclipse para depurar. El host será localhost si estamos usando una máquina virtual de VirtualBox en nuestro equipo configurada con NAT, por ejemplo, o será la IP de la máquina a la que nos queramos conectar, en otro caso.

 

Aplicación Java remota

 

El puerto será el que hayamos configurado como puerto de depuración en el servidor de aplicaciones. Veamos cómo activar la depuración y configurar este puerto en 3 diferentes servidores de aplicaciones: Tomcat (que en realidad es sólo un contenedor de servlets), JBoss y Weblogic:

 

Activación del modo de depuración en el servidor de aplicaciones

 

Tomcat

 

Para hacer que en Tomcat siempre se arranque el servidor en modo depuración, se puede editar el fichero %TOMCAT_HOME%/bin/startup.sh y cambiar la última línea

 

exec "$PRGDIR"/"$EXECUTABLE"  start "$@"

 

por 

 

exec "$PRGDIR"/"$EXECUTABLE" jpda start "$@"

 

De este modo, siempre que se arranque Tomcat lo hará en modo depuración (podríamos haber sido más sutiles, pero para los objetivos del tutorial, esta es la forma más rápida). Por defecto, el puerto de depuración será el 8000 (dato que tendremos que poner en el Eclipse; OJO: Si utilizamos una máquina local de VirtualBox, habrá que hacer el reenvío de este puerto de la máquina virtual a nuestro equipo!). Si queremos cambiar el puerto, debemos añadir el siguiente texto antes de la llamada exec "$PRGDIR"/"$EXECUTABLE"  jpda start "$@"

 

export JPDA_ADDRESS=8001

 

Después, debemos reiniciar Tomcat.

 

JBoss

 

Si usamos JBoss como servidor de aplicaciones, debemos editar el fichero de arranque del JBoss (run.sh u otro que acabe llamando a éste):

 

Cambiar la línea que tenga algo como esto:

 

JAVA_OPTS="$JAVA_OPTS -XX:PermSize=256m -XX:MaxPermSize=512m -Xms256m -Xmx512m 

 

añadiéndole el comando para activar la depuración:

 

JAVA_OPTS="$JAVA_OPTS  -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n -XX:PermSize=256m -XX:MaxPermSize=512m -Xms256m -Xmx512m 

 

El puerto al que conectarnos desde el Eclipse, en este caso, sería el 8787. Se debe reiniciar JBoss después de realizar el cambio.

 

Weblogic (ejemplo sacado de la administración de Vignette Content Management)

 

Para depurar en Weblogic, debemos ir a la "Runtime Services Console" y navegar hasta el servidor. Por ejemplo, navegamos a “vgndomain > Servers > VgnVCMServer”. La línea del comando de depuración es similar a la del JBoss: -Djava.compiler=NONE -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,address=1443,suspend=n

 

Vamos a “configuration” y ahí a la pestaña “remote start”. Añadimos el comando de depuración al campo “arguments” y, como en los otros casos, reiniciamos el servidor que queremos depurar. En este caso, el puerto de depuración es el 1443 (usamos el puerto por defecto de cada servidor de aplicaciones, pero lógicamente este puerto se puede cambiar).

 

Y eso es todo, hemos visto como depurar remotamente en Eclipse aplicaciones web desplegadas sobre Tomcat, JBoss y Weblogic, que como hemos podido comprobar es bastante sencillo. Una vez arrancado en modo de depuración y conectados Eclipse y servidor, sólo tenemos que poner los puntos de ruptura (breakpoints) adecuados en nuestras clases para ver cuál es el problema. Ah, acordáos de compilar las clases con las opciones de lines, vars, y source!!