Depurar con Eclipse

1. Información general

En esta guía rápida, veremos cómo depurar programas Java utilizando el IDE de Eclipse.

2. Conceptos básicos

Eclipse tiene un gran soporte para depurar una aplicación. Visualiza la ejecución paso a paso y nos ayuda a descubrir errores.

Para demostrar las funciones de depuración en Eclipse, usaremos un programa de muestra PerfectSquareCounter . Este programa cuenta el total de cuadrados perfectos e incluso cuadrados perfectos bajo un número dado:

public class PerfectSquareCounter { static int evenPerfectSquareNumbers = 0; public static void main(String[] args) { int i = 100; System.out.println("Total Perfect Squares: " + calculateCount(i)); System.out.println("Even Perfect Squares : " + evenPerfectSquareNumbers); } public static int calculateCount(int i) { int perfectSquaresCount = 0; for (int number = 1; number <= i; number++) { if (isPerfectSquare(number)) { perfectSquaresCount++; if (number % 2 == 0) { evenPerfectSquareNumbers++; } } } return perfectSquaresCount; } private static boolean isPerfectSquare(int number) { double sqrt = Math.sqrt(number); return sqrt - Math.floor(sqrt) == 0; } }

2.1. Modo de depuración

Primero, necesitamos iniciar el programa Java dentro de Eclipse en modo de depuración. Esto puede lograrse de dos formas:

  • Haga clic derecho en el editor y seleccione Depurar como -> Aplicación Java (que se muestra en la siguiente captura de pantalla)
  • Depura el programa desde la barra de herramientas (resaltado en la siguiente captura de pantalla)

2.2. Puntos de interrupción

Necesitamos definir los puntos en los que la ejecución del programa debe detenerse para la investigación. Estos se denominan puntos de interrupción y se aplican a los métodos. También se pueden definir en cualquier momento antes o durante la ejecución.

Básicamente, hay 3 formas de agregar puntos de interrupción al programa:

  • Haga clic con el botón derecho en la barra de marcadores (regla vertical) correspondiente a la línea y seleccione Alternar punto de interrupción (que se muestra en la siguiente captura de pantalla)
  • Presione Ctrl + Shift + B en la línea necesaria mientras está en el editor
  • Haga doble clic en la barra de marcador (regla vertical) correspondiente a la línea necesaria

2.3. Controles de flujo de código

Ahora que el depurador se detiene en los puntos de interrupción dados, podemos continuar con la ejecución.

Supongamos que el depurador está actualmente posicionado según la siguiente captura de pantalla, en la línea 16:

Las opciones de depuración más utilizadas son:

  • Step Into (F5): esta operación va dentro de los métodos utilizados en la línea actual (si corresponde); de lo contrario, pasa a la siguiente línea. En este ejemplo, llevará al depurador dentro del método isPerfectSquare ()
  • Paso por encima (F6): esta operación procesa la línea actual y pasa a la línea siguiente. En este ejemplo, esto ejecutará el método isPerfectSquare () y pasará a la siguiente línea
  • Step Return (F7): esta operación finaliza el método actual y nos lleva de vuelta al método de llamada. Dado que en este caso, tenemos un punto de interrupción en el ciclo, todavía estará dentro del método, de lo contrario volvería al método principal
  • Reanudar (F8): esta operación simplemente continuará con la ejecución hasta que el programa finalice a menos que lleguemos a un punto de interrupción adicional

2.4. Perspectiva de depuración

Cuando iniciamos el programa en modo de depuración, Eclipse nos mostrará una opción para cambiar a la perspectiva de depuración. La perspectiva de depuración es una colección de algunas vistas útiles que nos ayudan a visualizar e interactuar con el depurador.

También podemos cambiar a la perspectiva de depuración manualmente en cualquier momento.

Estas son algunas de las vistas más útiles que contiene:

  • Vista de depuración : muestra los diferentes subprocesos y seguimientos de la pila de llamadas
  • Vista de variables : muestra los valores de las variables en cualquier punto dado. Si necesitamos ver las variables estáticas, necesitamos especificar explícitamente que
  • Puntos de interrupción: muestra los diferentes puntos de interrupción y puntos de observación (que veremos a continuación)
  • Shell de depuración : esto nos permite escribir y evaluar código personalizado durante la depuración (un ejemplo se cubre más adelante)

3. Técnicas

En esta sección, veremos algunas técnicas importantes que nos ayudarán a dominar la depuración en Eclipse.

3.1. Variables

Podemos ver los valores de las variables durante la ejecución en la vista Variables. Para ver las variables estáticas, podemos seleccionar la opción desplegable Java -> Mostrar variables estáticas .

Usando la vista de variables, es posible cambiar cualquier valor al valor deseado durante la ejecución.

Por ejemplo, si necesitamos omitir algunos números y comenzar directamente con el número 80, podríamos hacerlo cambiando el valor de la variable número :

3.2. Inspección de valores

Si necesitamos inspeccionar el valor de una expresión o declaración de Java, podemos seleccionar la expresión en particular en el editor, hacer clic con el botón derecho e inspeccionar, como se muestra a continuación. Un atajo útil es presionar Ctrl + Shift + I en la expresión para ver el valor:

In case we need to permanently inspect this expression, we can right-click and Watch. Now, this gets added to the Expressions view and the value of this expression can be seen for different runs.

3.3. Debug Shell

In the context of the debugging session, we can write and run custom code to evaluate possibilities. This is done in the Debug Shell.

For example, if we need to cross-check the correctness of the sqrt functionality, we could do it in the Debug Shell. On the code, Right-click -> Inspect to see the value:

3.4. Conditional Breakpoints

There will be cases in which we want to debug only for specific conditions. We can achieve this by adding conditions to a breakpoint in one of two ways:

  • Right-click on the breakpoint and choose Breakpoint Properties
  • In Breakpoint view, select the breakpoint and specify the condition

For example, we can specify the breakpoint to suspend the execution only if number is equal to 10:

3.5. Watchpoints

Whatbreakpoints are for methods, watchpoints are for class-level variables. In this current example, the breakpoint on evenPerfectSquareNumbers declaration is called a watchpoint. Now, the debugger will pause the execution every time the field is accessed or modified on a watchpoint.

This is the default behavior, which can be changed in the watchpoint's properties.

In this example, the debugger will stop execution every time a perfect square is an even number:

3.6. Trigger Points

Let's assume that we're debugging a complex issue in an application with a huge amount of source code. The debugger will keep suspending the flow due to scattered breakpoints.

When a breakpoint is marked as a trigger point, it means that the rest of the breakpoints will be enabled only if this breakpoint is hit.

For example, in the screenshot below, the breakpoint on isPerfectSquare() is supposed to be hit for every iteration in the loop. However, we've specified the breakpoint on calculateCount() method as a trigger point, along with a condition.

So, when the iteration count reaches 10, this will trigger the rest of the breakpoints. Hence, from now on, if the breakpoint on isPerfectSquare() is hit, the execution will get suspended:

3.7. Remote Debugging

Finalmente, si la aplicación se ejecuta fuera de Eclipse, aún podemos usar todas las funcionalidades anteriores, siempre que la aplicación remota permita la depuración. Desde Eclipse, seleccionaríamos Depurar como aplicación Java remota .

4. Conclusión

En esta guía rápida, hemos visto los conceptos básicos y las diferentes técnicas de depuración de programas en Eclipse IDE.

Como siempre, el código fuente utilizado en este ejercicio está disponible en GitHub.