Debug con Eclipse

1. Panoramica

In questa guida rapida, vedremo come eseguire il debug dei programmi Java utilizzando l'IDE Eclipse.

2. Concetti di base

Eclipse ha un ottimo supporto per il debug di un'applicazione. Visualizza l'esecuzione passo passo e ci aiuta a scoprire i bug.

Per dimostrare le funzionalità di debug in Eclipse, utilizzeremo un programma di esempio PerfectSquareCounter . Questo programma conta i quadrati perfetti totali e anche i quadrati perfetti sotto un dato numero:

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. Modalità di debug

Innanzitutto, dobbiamo avviare il programma Java in Eclipse in modalità debug. Ciò può essere ottenuto in due modi:

  • Fare clic con il tasto destro sull'editor e selezionare Debug As -> Applicazione Java (mostrato nell'immagine sottostante)
  • Eseguire il debug del programma dalla barra degli strumenti (evidenziato nell'immagine sottostante)

2.2. Punti di interruzione

Dobbiamo definire i punti in cui l'esecuzione del programma deve fermarsi per l'indagine. Questi sono chiamati punti di interruzione e sono applicabili ai metodi. Possono anche essere definiti in qualsiasi momento prima o durante l'esecuzione.

Fondamentalmente, ci sono 3 modi per aggiungere punti di interruzione al programma:

  • Fare clic con il pulsante destro del mouse sulla barra del contrassegno (righello verticale) corrispondente alla linea e selezionare Attiva / disattiva punto di interruzione (mostrato nell'immagine sottostante)
  • Premi Ctrl + Maiusc + B sulla riga necessaria mentre sei nell'editor
  • Fare doppio clic sulla barra del contrassegno (righello verticale) corrispondente alla linea necessaria

2.3. Controlli del flusso di codice

Ora che il debugger si ferma ai punti di interruzione dati, possiamo procedere con un'ulteriore esecuzione.

Supponiamo che il debugger sia attualmente posizionato come nello screenshot sottostante, alla riga 16:

Le opzioni di debug più comunemente utilizzate sono:

  • Step Into (F5) - Questa operazione rientra nei metodi utilizzati nella riga corrente (se presenti); altrimenti, procede alla riga successiva. In questo esempio, verrà utilizzato il debugger all'interno del metodo isPerfectSquare ()
  • Step Over (F6) - Questa operazione elabora la riga corrente e procede alla riga successiva. In questo esempio, questo eseguirà il metodo isPerfectSquare () e procederà alla riga successiva
  • Step Return (F7) - Questa operazione termina il metodo corrente e ci riporta al metodo chiamante. Poiché in questo caso, abbiamo un punto di interruzione nel ciclo, sarà ancora all'interno del metodo, altrimenti tornerebbe al metodo principale
  • Resume (F8) - Questa operazione continuerà semplicemente con l'esecuzione fino al termine del programma, a meno che non si raggiunga un ulteriore punto di interruzione

2.4. Prospettiva di debug

Quando avviamo il programma in modalità debug, Eclipse chiederà un'opzione per passare alla prospettiva Debug. La prospettiva Debug è una raccolta di alcune visualizzazioni utili che ci aiutano a visualizzare e interagire con il debugger.

Possiamo anche passare manualmente alla prospettiva Debug in qualsiasi momento.

Ecco alcune delle visualizzazioni più utili che questo contiene:

  • Visualizzazione debug : mostra i diversi thread e le tracce dello stack di chiamate
  • Visualizzazione delle variabili : mostra i valori delle variabili in un dato punto. Se abbiamo bisogno di vedere le variabili statiche, dobbiamo specificarlo esplicitamente
  • Breakpoint : mostra i diversi breakpoint e watchpoint (che vedremo di seguito)
  • Shell di debug : questo ci consente di scrivere e valutare codice personalizzato durante il debug (un esempio verrà trattato più avanti)

3. Tecniche

In questa sezione, esamineremo alcune importanti tecniche che ci aiuteranno a padroneggiare il debug in Eclipse.

3.1. Variabili

Possiamo vedere i valori delle variabili durante l'esecuzione nella vista Variabili. Per vedere le variabili statiche, possiamo selezionare l'opzione a discesa Java -> Mostra variabili statiche .

Utilizzando la visualizzazione delle variabili, è possibile modificare qualsiasi valore nel valore desiderato durante l'esecuzione.

Ad esempio, se dobbiamo saltare alcuni numeri e iniziare direttamente con il numero 80, potremmo farlo modificando il valore della variabile numero :

3.2. Ispezione dei valori

Se è necessario ispezionare il valore di un'espressione o di un'istruzione Java, è possibile selezionare la particolare espressione nell'editor, fare clic con il pulsante destro del mouse e Ispeziona, come mostrato di seguito. Una comoda scorciatoia è quella di colpire Ctrl + Maiusc + I sull'espressione per vedere il valore:

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

Infine, se l'applicazione è in esecuzione al di fuori di Eclipse, possiamo comunque utilizzare tutte le funzionalità di cui sopra, a condizione che l'applicazione remota consenta il debug. Da Eclipse, selezioneremo Debug come applicazione Java remota .

4. Conclusione

In questa guida rapida, abbiamo visto le basi e le diverse tecniche di debug dei programmi in Eclipse IDE.

Come sempre, il codice sorgente utilizzato in questo esercizio è disponibile su GitHub.