Depuración con Eclipse

Eclipse cuenta con una perspectiva dedicada para la depuración. En esta perspectiva se puede controlar la ejecución de un programa e investigar el estado de las variables.

Puntos de ruptura

Los puntos de ruptura permiten detener el programa en un punto determinado para examinar el estado de las variables. Para crear un punto de ruptura:

  • Clic derecho sobre el margen izquierdo del editor y seleccionar "Conmutar punto de interrupción".
  • Doble clic en el margen del editor.
El punto de interrupción aparece como una esfera azul.

Para eliminar un punto de rupturo basta con hacer lo mismo que para crearlo.

Iniciar la depuración

Para depurar una aplicación, elegimos un archivo Java que pueda ser ejecutad, hacemos clic derecho sobre él y elegimos Depurar como\Aplicación Java

Tomemos como ejemplo el siguiente código. Crea un proyecto con las siguientes clases.

// Main.java public class Main { public static void main(String[] args) { // TODO Apéndice de método generado automáticamente Contador contador = new Contador(); for (int i=0; i<10; i++){ contador.contar(); } System.out.println("Hemos contado " + contador.getContador()); System.exit(0); } } /*-------------------------------------- */ // Contador.java public class Contador { private int contador; public Contador(){ contador = 0; } public void contar(){ contador++; } public int getContador(){ return contador; } @Override public String toString() { return "El valor de contador es: " + contador; } }

Cuando iniciamos la depuración cambia la vista de Eclipse a vista de depuración.

Una vez que hemos depurado una vez nuestro proyecto, tendremos un nuevo botón de depuración en la barra de herramientas (con forma de insecto):

El botón de depuración tiene forma de insecto.

Si no se definen puntos de ruptura, la ejecución es la normal.

Controlar el programa de ejecución

Eclipse proporciona botones en la barra de herramientas para controlar la ejecución del programa. En lugar de dichos botones podemos usar las teclas F5, F6, F7 y F8 para hacer lo mismo:

  • F5 ejecuta la línea actual y pasa a la siguiente linea de programa. Si la linea elegida es una llamada a un método, el depurador entra dentro del método.
  • F6 ejecuta un método sin entrar y ejecutar línea a línea.
  • F7 finaliza la ejecución del método actual y regresa a la llamada del método.
  • F8 indica a eclipse que continue la ejecución hasta volver a encontrar el siguiente punto de ruptura.
Equivalencias entre las teclas Fx y la barra de herramientas

La pila de ejecución muestra las partes del programa que se están ejecutando actualmente.

Pila de ejecución

Vista de los puntos de ruptura

En la vista de los puntos de ruptura se pueden activar y desactivar los puntos de ruptura, mediante casillas de verificación.

Vista de los puntos de interrupcion

También podemos desactivar todos los puntos de interrupción, con el botón "Saltarse todos los puntos de interrupción" (aparece con un punto de interrupción tachado).

Evaluar las variables

Las variables se pueden examinar en la vista de variables.

Vista de variables

El menú desplegable de la vista de variables permite customizar la forma en que se muestran. Por ejemplo, podemos mostrar el tipo actual y el tipo real de cada varaible. Para ello, vamos a Diseño\Mostrar Columnas y Diseño\Seleccionar columnas

Columnas de tipo

Cambiar el valor de una variable en caliente

Podemos cambiar el valor de una variable sobre la marcha, simplemente haciendo clic sobre su valor.

Cambio en caliente del valor de las variables

El modo en que se muestran las variables

Al hacer clic sobre un objeto, Eclipse busca el método toString(). En cualquier caso, nosotros podemos redefinir el método que da formato al contenido del objeto. Al hacer clic derecho sobre el objeto, puedo elegir la opción Formateador de detalle nuevo

Formateador toString
Crear un nuevo formateador

Actividad 0. Escribe una clase que siga el siguiente diagrama de clases.

La clase realiza ordenación de un array por el método de la burbuja.

Descripción de la clase:

  • Atributo arraySinOrdenar: contiene el array sin ordenar.
  • Atributo arrayOrdenado: contiene el array que se va a ordenar.
  • Atributo ordenacionTerminada: al crear la clase, el atributo ordenacionTerminada vale false. Tras ejecutar el método ordenar() se pone a true
  • Método setArrayAOrdenar: asigna un array al atributo arraySinOrdenar.
  • Método ordenar(): realiza las siguientes tareas:
    1. Ordena el array arrayOrdenado
    2. Asigna el valor true al atributo ordenacionTerminada
  • Método getArrayOrdenado: devuelve el array arrayOrdenado siempre que la variable ordenacionTerminada contenga el valor true. En otro caso, devuelve null.
  • Método IsOrdenacionTerminada: devuelve el valor de la variable ordenacionTerminada
  • Método toString: devuelve una cadena de texto con un contenido como el siguiente (cuando aun no se ha ordenado el array):
  • El array sin ordenar tiene los siguientes valores: 1, 3, 23, 12, 9, 11, 40 El array se está ordenando: 1, 3, 12, 9, 23, 11, 40
  • Método toString: devuelve una cadena de texto con un contenido como el siguiente (cuando ya ha sido ordenado):
  • El array sin ordenar tiene los siguientes valores: 1, 3, 23, 12, 9, 11, 40 El array ordenado tiene los siguientes valores: 1, 3, 9, 11, 12, 23, 40

Finalmente utiliza la siguiente clase, como clase principal del proyecto:

import java.util.Random; public class Ordenacion { public static void main(String[] args) { Burbuja burbuja = new Burbuja(); int[] valores = new int[10]; Random aleatorio = new Random(); for (int i=0; i<valores.length; i++) { valores[i] = aleatorio.nextInt(100); } burbuja.setArrayAOrdenar(valores); burbuja.ordenar(); System.out.println(burbuja.toString()); } }

Actividad 1. Crea un punto de interrupción en cada paso de ordenación, para poder ver el cambio que se produce en el array que se está ordenando. Por ejemplo:

Se pueden observar los valores de los arrays.

Toma dos capturas donde se pueda ver el contenido del array en varios momentos durante la ordenación. Guárdalas con el nombre Act1-depuracion-eclipse.zip.

Depuración avanzada

Podemos modificar el comportamiento por defecto de los puntos de ruptura. Si hacemos clic derecho sobre un punto de ruptura, podemos definir condiciones que restringen la activación del punto de ruptura.

Por ejemplo, podríamos indicar que un punto de ruptura solamente se active una vez que se ha pasado por él 5 veces. Para ello, debemos hacer clic derecho sobre el punto de ruptura y elegir la opción "Propiedades del punto de interrupción".

Propiedades del punto de ruptura

También podemos utilizar condiciones más complejas, que impliquen la escritura de mensajes de depuración.

Condición para activar el punto de ruptura.

Puntos de observación

Los puntos de observación son puntos de ruptura sobre un atributo de una clase. El depurador se detendrá cuando dicho campo sea modificado

Para crear un punto de observación, nos vamos al atributo y creamos un punto de interrupción sobre él (y podremos ver un icono en forma de gafas).

Punto de observación sobre la variable "contador"

Podemos modificar las propiedades de un punto de observación igual que cualquier otro punto de ruptura, de forma que que se active cuando se lea su valor, y cuando se escriba también.

Propiedades de un punto de observación.

Punto de ruptura sobre método

Es un punto de ruptura creado en la cabecera de un método.

En las propiedades, podemos decidir si el punto de ruptura se crea a la entrada o a la salida del mismo

Puntos de ruptura para clases

Un punto de ruptura de una clase se activa al cargar una clase. Para crear un punto de ruptura sobre una clase, debemos hacerlo junto a la declaración de la clase

Filtro de depuración

Podemos definir ciertos paquetes que no serán depurados. Esto es útili si estamos usando un framework, pero no queremos entrar en sus clases. Esto se puede definir en Ventana\Preferencias\Java\Depurar\Filtrado de recorrer. Aquí podemos añadir los paquetes que decidamos.

Actividad 2. En el algoritmo de la burbuja las cifras más pesadas se van al final (o al principio) del array. Supón que deseas observar cómo se produce la ordenación únicamente del primer número y del último.

Supongamos que nos disponemos a ordenar los siguientes números: 6, 22, 54, 88, 23, 37, 8, 20, 48, 1

Añade el código necesario en el punto de interrupción preciso, para que se cumplan los siguientes requisitos:

  • Durante la primera iteración de la burbuja, el depurador se detendrá en cada recolocación de un número, y al finalizar se podrá ver un mensaje como el siguiente:
  • ITERACIÓN NÚMERO 0: El número 88 se desplaza de la posición 3 a la posición 4 El número 88 se desplaza de la posición 4 a la posición 5 El número 88 se desplaza de la posición 5 a la posición 6 El número 88 se desplaza de la posición 6 a la posición 7 El número 88 se desplaza de la posición 7 a la posición 8 El número 88 se desplaza de la posición 8 a la posición 9
  • Durante la última iteración (en este caso, puesto que el array tiene 10 elementos, la última iteración sería la número 8) se muestra el siguiente mensaje:
  • ITERACIÓN NÚMERO 8: El número 6 se desplaza de la posición 0 a la posición 1

Toma las siguientes capturas:

  • Una captura por cada condición de parada que hayas escrito
  • Una captura donde se puedan ver los mensajes escritos en la consola por el depurador.

Guarda todas las capturas en un mensaje llamado Act2-depuracion-eclipse.zip

Depuración remota

Podemos depurar aplicaciones que se están ejecutando en otra máquina. Para ello debemos seguir los siguientes pasos:

  1. En la máquina donde se vaya a ejecutar el programa, utilizamos el siguiente comando:
  2. java -Xdebug -Xrunjdwp:transport=dt_socket,address=1044,server=y,suspend=y -jar programa_depurado.jar

    Las opciones utilizadas son las siguientes:

    • -Xdebug Le decimos a la máquina virtual que debe permitir a un proceso remoto que se conecte para debug. Vaya, que debe dar permiso al eclipse para conectarse.
    • -Xrunjdwp:transport Se le pasa detrás una lista de opciones separadas por comas para indicar cómo se va a establecer esa conexión.
    • dt_socket será con un socket
    • address=1044 será por el puerto 1044
    • server=y La máquina virtual actuará como servidor.
    • suspend=n El programa no quedará en espera del debugger, sino que empezará a correr inmediatamente.
  3. A continuación establecemos en Eclipse la configuración de depuración remota. Para ello, nos vamos a la opción Ejecutar\Configuraciones de depuración\Aplicacion Java Remota e indicamos la dirección ip de la máquina donde se ejecuta el programa, así como el puerto indicado en la ejecución.

Actividad 3. Depura remotamente el proyecto Ordenacion remotamente en el ordenador de un compañero.

El código fuente del proyecto es el siguiente: depuracion.zip


Deberás tomar las siguientes capturas:

  • Una captura donde se vea el comando con el que ejecutamos el proyecto
  • Una captura donde se pueda ver cómo configuramos Eclipse para conectarse remotamente a la ejecución
  • Una captura donde se pueda ver cómo se está ejecutando remotamente en la vista Depurar

NOTA: Añade al código un comentario donde se pueda leer tu nombre.

Comprime el ejercicio en un archivo llamado Act3-depuracion-eclispe.zip, de forma que incluya todo lo necesario para comprobar el ejercicio al descomprimir.