Depuración sobre un servidor remoto. Remote Debugging

En este tutorial veremos como depurar de forma remota código java que puede estar ejecutándose en un servidor que no es la máquina donde estamos ejecutando Eclipse. Veremos con más en detalle como funciona el proceso de depuración en eclipse y el servidor Tomcat. También veremos algunos conceptos sobre entorno de desarrollo en las empresas.

Workstation y Host. Estación de Trabajo y Servidor

Workstation o Estación de Trabajo es la máquina donde trabaja el programador y donde está instalado elipse. Un Host o Servidor es una máquina donde se instalan las aplicaciones de servidor como las aplicaciones webs, servidores de base de datos SQL, servicios Web, etc. Típicamente un programador trabaja sobre su Workstation y cuando tiene una versión estable, la publica (hace un despliegue) en el Host para que la vean los clientes, usuarios de la aplicación o equipos de testing.

Entorno de desarrollo, integración, pre-producción y producción

El entorno de desarrollo es el conjunto de hardware y software que utiliza el programador para programar. Puede estar compuesto sólo de un Workstation o también incluir uno o más servidores Host. A veces en vez de utilizar un servidor Web en nuestra Workstation se utiliza un servidor para publicar la aplicación.

Cuando la aplicación esta finalizada se instala en uno o varios servidores o Hosts que se conocen como entorno de producción. Esta instalación será la que usan los usuarios finales de la aplicación Web.

En empresas grandes existen entornos intermedios conocidos como integración, pre-producción o testing usados para probar la aplicación antes de pasarla al entorno de producción.

¿Cuándo nos interesa la depuración remota?

Cuando una aplicación está instalada sobre un servidor de integración o producción es normal que se comunique con otras aplicaciones (Ej.: servidores SQL, servicios Web, etc.). Muchas veces esta interacción solo puede ser probada en el servidor. Muchas veces las Workstations usan Windows y los servidores Linux.

Debido a lo antes mencionado muchas veces encontramos errores que solo se ven cuando nuestra aplicación está instalada en el servidor mientra que en nuestra Workstation funciona. Otras veces ni siquiera es posible probar ciertas funcionalidades en la Workstation. En estos casos poder depurar la aplicación en el servidor es de gran ayuda.

¿Cómo funciona la depuración remota?

La depuración remota es una capacidad que ofrece la maquina virtual de java JVM. Esta facilidad no está limitada a Tomcat y se puede usar con cualquier programa escrito en java.

El siguiente gráfico muestra una aplicación Web llamada app1 desplegada sobre un Tomcat instalado en un Host y que está siendo depurada desde un eclipse instalado sobre una Workstation.

En Eclipse se encuentra el código fuente de la aplicación app1 con los breakpoints donde se quiere que se detenga el depurador. La JVM se comunica con Elipse usando el protocolo tcp/ip.

Para iniciar este esquema se arranca Tomcat para depuración remota indicando un puerto tcp/ip (ej:8000) donde se quedará esperando que se conecte Eclipse. Luego en Eclipse iniciamos una depuración remota indicando la dirección ip del Host y el puerto indicado (Ej.:8000).

Depurando nuestro ejemplo first-jee

Lo primero que haremos es generar el archivo first-jee.war y copiarlo al directorio webapps de Tomcat (Botón derecho del ratón sobre el proyecto - Export - WAR file ...). Una vez copiado necesitamos iniciar Tomcat en depuración remota.

Los contenedores de Servlets como Tomcat son aplicaciones java. Si recuerdan de los tutoriales anteriores, arrancábamos el Tomcat con start.bat. Cuando ejecutamos start.bat este ejecuta setclasspath.bat y finalmente catalina.bat el cual termina ejecutando algo similar a:

java -classpath "C:\apache-tomcat-6.0.33\bin\bootstrap.jar" org.apache.catalina.startup.Bootstrap

Esta instrucción le dice a la JVM que ejecute el método estático main de la clase Bootstrap que se encuentra dentro del archivo bootstrap.jar. El método main iniciará el servidor que se quedará esperando peticiones http en el puerto 8080 (por defecto).

Podemos decirle a la JVM que queremos que se inicie en forma de debug remoto incluyendo las opciones -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y

java -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y -classpath "C:\apache-tomcat-6.0.33\bin\bootstrap.jar" org.apache.catalina.startup.Bootstrap

Como hemos indicado suspend=y la JVM se queda esperando la conexión del depurador en el puerto 8000. Para establecer esta conexión en Eclipse vamos a menú Run - Debug Configuration - Remote Java Application -new

En Project indicamos el proyecto que contiene el código fuente de la aplicación que vamos a depurar. En Host debemos indicar la dirección ip del Host donde esta el servidor (En este ejemplo estoy usando la misma máquina por lo que uso localhost), en port ponemos el puerto elegido cuando arrancamos la JVM (en nuestro caso 8000) y por ultimo click en Debug.

Si vamos a la despectiva de debug veremos la pila de ejecución que indica [localhost:8000]

Nos aseguramos que todavía tenemos el breakpoint en LoginServlet.java, abrimos un browser en localhost:8080/first-jee/login-servlet.html y oprimimos el botón. En la perspectiva de debug vemos la ejecución interrumpida de igual forma que en el tutorial anterior.

Conclusiones

Es importante destacar:

  1. Los contenedores de servlets (como Tomcat) son aplicaciones java que se ejecutan sobre una JVM.
  2. La capacidad de depuración es intrínseca de la JVM. Podemos depurar remotamente cualquier aplicación java.

En el próximo tutorial veremos más sobre jsp java server pages.

<< Depurar nuestra aplicación web. Debugging. Index >>