Cómo depurar una aplicación Java con un IDE

Escrito por picodotdev el .
java planeta-codigo
Enlace permanente Comentarios

La depuración de un programa o debug permite ejecutar un programa de forma interactiva, paso a paso y examinar los valores de las variables. Esto proporciona valiosa información que permite comprobar el correcto funcionamiento de un programa o descubrir la causa de un error del que las trazas no proporcionan información suficiente. Los depuradores o debuggers son las aplicaciones que ejecutan el programa en modo depuración, permiten establecer puntos de ruptura, continuar la ejecución paso a paso o hasta el siguiente punto de ruptura e inspeccionar los valores de las variables. Los entornos integrados de desarrollo o IDE de Java como IntelliJ IDEA y eclipse ofrecen soporte para hacer depuración.

Pocos programas están libres de errores, algunos errores se producen cuando se cumplen ciertas condiciones en los datos que maneja una aplicación. En ocasiones descubrir la causa de un error es suficiente si la aplicación emite trazas pero en los errores más complicados o con poca información se requiere depurar el programa.

La depuración se emplea en el momento de desarrollo o para reproducir y descubrir en el entorno de desarrollo local un error que se está produciendo en producción. Por la utilidad de la depuración todos los lenguajes ofrecen alguna posibilidad de hacer depuración. En Java la depuración se realiza configurando la máquina virtual con ciertos argumentos y el entorno integrado de desarrollo o IDE para conectarse a la máquina virtual.

Qué es la depuración de un programa

La depuración o debug es una forma de ejecución de un programa con la que el programador puede observar de forma interactiva la ejecución línea a línea del código fuente con el objetivo de eliminar algún error. El depurador o debugger es una aplicación que permite añadir puntos de ruptura o breakpoints donde el depurador para la ejecución, inspeccionar los valores de las variables, continuar la ejecución hasta la siguiente línea o hasta el siguiente punto de ruptura, continuar la ejecución entrando en una función o sin entrar en la función.

Configurar la máquina virtual Java para hacer debug

Para depurar un programa Java es necesario configurar la máquina virtual Java o JVM en modo debug. Esta configuración de la JVM se realiza añadiendo ciertos argumentos al comando que inicia la aplicación.

Un ejemplo de programa para practicar cómo depurar es el siguiente.

1
2
3
4
5
6
7
8
package io.github.picodotdev.blogbitix.java.helloworld;

public class Main {

    public static void main(String[] args) {
        System.out.println("Hola mundo!");
    }
}
Main.java

Debug con el comando java

Si la aplicación se inicia con el comando java hay que añadir los siguientes argumentos para la máquina virtual. Estos argumentos indican a la máquina virtual que acepte conexiones de red para realizar depuración desde un depurador como un IDE de forma remota o desde la máquina local.

  • -agentlib:jdwp: habilita el protocolo de depuración (JDWP) en la máquina virtual. Este es el argumento principal que habilita la depuración.
  • transport=dt_socket: se usa una conexión de red para las conexiones de depuración.
  • server=y: escucha conexiones de los depuradores. con valor n, el proceso intenta conectarse a un depurador en vez de esperar conexiones. El valor n requiere argumentos adicionales.
  • suspend=n: con el valor n no se espera a una conexión del depurador en el inicio. La aplicación se inicia y ejecuta con normalidad hasta que un depurador se conecta. Con el valor y, la aplicación no empieza hasta que un depurador se conecta.
  • address=5005: indica el puerto en el que la máquina virtual acepta conexiones.
1
2
 $ java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -classpath "target/classes:libraries/*" io.github.picodotdev.blogbitix.java8.helloworld.Main 

java-debug.sh

Debug con Gradle

En el momento de desarrollo si se emplea la herramienta de construcción Gradle también es posible arrancar la máquina virtual de la aplicación en modo depuración a la espera de la conexión del depurador. En el primer comando se inicia la depuración en el puerto 5005 y con el segundo comando utilizando la variable de entorno GRADLE_OPTS es posible especificar los mismos parámetros de la máquina virtual que al ejecutar la aplicación Java directamente.

1
2
3
4
5
6
$ ./gradlew run --debug-jvm
...
Listening for transport dt_socket at address: 5005

$ GRADLE_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005" ./gradlew run
Listening for transport dt_socket at address: 5005
gradle-run-1.sh

La configuración del debug también es posible especificarla en el archivo de construcción del proyecto.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
...

run {
    debugOptions {
       enabled = true
       server = true
       suspend = true
       port = 5005
   }
}
build.gradle
1
2
$ ./gradlew run
Listening for transport dt_socket at address: 5005
gradle-run-2.sh

Depurar una aplicación Java con un IDE

El depurador permite añadir puntos de ruptura en cualquiera de las líneas del código fuente del programa para que la ejecución se detenga cuando se llegue a ese punto. Una vez detenida la ejecución el depurador permite examinar los valores de las variables disponibles en el ámbito de detención de la ejecución.

Para continuar la ejecución si se ha detenido en una línea de código con una llamada a una función el depurador ofrece la posibilidad de continuar entrando al código de esa función o saltar a la siguiente línea de código, también se ofrece la posibilidad de continuar la ejecución hasta la siguiente punto de ruptura. Los puntos de ruptura se pueden habilitar o deshabilitar, no siendo necesario eliminarlos para que no tengan efecto.

Cómo depurar código Java con IntelliJ IDEA

Arrancada la máquina virtual en modo depuración hay que configurar IntelliJ para que se conecte a la máquina virtual ya sea con una configuración de inicio de la aplicación o uniendo el IDE a un proceso local de la máquina virtual en modo depuración desde el menú Run > Attach to Process.

Configuración de depuración remota

Añadir un punto de ruptura se hace desde el espacio vertical del editor del código fuente al inicio de cada línea, de forma alternativa utilizando la combinación de teclas Ctrl+F8 añade un punto de ruptura en la línea de edición actual. Los puntos de ruptura pueden ser:

  • De línea: suspende la ejecución al llegar a esa línea de código.
  • De método: suspende la ejecución al entrar o salir del método.
  • De variable: suspende la ejecución al leer o escribir en la variable.
  • De excepción: suspende la ejecución cuando una excepción es lanzada en este caso no depende de una referencia de código concreta.

La combinación de teclas para continuar la ejecución cuando se ha suspendido por llegar a un punto de ruptura son:

  • Sin entrar en la función o step over: F8.
  • Entrar a la función o step into: F7.
  • Salir de la función o step out: Shift+F8.
  • Hasta llegar a la posición del cursor: Alt+F9.

El programa se detiene en el punto de ruptura, los valores de las variables en el contexto donde se ha detenido la ejecución se pueden inspeccionar, en este caso el valor del array con los argumentos del programa.

Depuración de un programa en IntelliJ IDEA

Cómo depurar código Java con eclipse

El entorno de desarrollo integrado eclipse también ofrece un depurador para aplicaciones Java. Permite iniciar una aplicación en modo depuración, conectarse a una máquina virtual externa configurada con soporte para depuración, establecer puntos de ruptura con la combinación de teclas Ctrl+Shift+B, continuar la ejecución cuando se ha suspendido e inspeccionar los valores de las variables.

Configuración de depuración remota

La combinación de teclas para continuar la ejecución cuando se ha suspendido por llegar a un punto de ruptura son:

  • Sin entrar en la función o step over: F6.
  • Entrar a la función o step into: F5.
  • Salir de la función o step out: F7.
  • Hasta llegar a la posición del cursor: Ctrl+R.

Los puntos de ruptura se crean con la tecla Ctrl+Shift+B o con el botón derecho desde el espacio vertical del editor del código fuente al inicio de cada línea.

Depuración de un programa en eclipse

El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub y probarlo en tu equipo ejecutando siguiente comando:
./gradlew run

Comparte el artículo: