![]() ![]() |
|
![]() ![]() |
L'inserimento di messaggi di tracciamento (e delle asserzioni)
comporta tipicamente una grossa perdita di tempo (decidere dove e
quali messaggi inserire, analizzare l'output, attivarli e
disattivarli, ...).
I programmatori professionisti si affidano invece ai cosiddetti debugger (disinfestatori): sono programmi speciali che vengono utilizzati per eseguire un altro programma e analizzare il suo stato e comportamento durante l'esecuzione di singole istruzioni. I moderni ambienti di sviluppo contengono debugger integrati che permettono di arrestare l'esecuzione del programma in punti precisi, ispezionare la pila di esecuzione, il contenuto di variabili locali, la stato degli oggetti creati, e molto altro ancora. Per utilizzare un debugger basta comprendere tre concetti basilari:
|
![]() ![]() |
|
![]() ![]() |
In Eclipse, i breakpoint si impostano con un semplice doppio
click col pulsante sinistro a lato della riga desiderata (vedrete
comparire un pallino azzurro). Come avvertenza generale, è
sconsigliabile avere più comandi sulla stessa riga (altrimenti
non sarà possibile associare breakpoint ad alcuni di essi).
Con un click del pulsante destro sopra il pallino di un breakpoint potrete impostare delle guardie avanzate sul punto di arresto scegliendo breakpoint properties e poi Common (ad esempio per fare in modo che il programma si interrompa solo quando una certa istruzione viene eseguita per la seconda volta, oppure se certe variabili hanno valori opportuni). Se vengono impostate delle guardie il pallino verrà affiancato da un punto interrogativo. Sempre col pulsante destro del mouse, potrete disabilitare breakpoint selettivamente senza rimuoverli (il pallino diventerà bianco). Per rimuoverli invece è sufficiente un doppio click col pulsante sinistro.
|
![]() ![]() |
|
![]() ![]() |
Una volta impostati i breakpoint ritenuti utili, per eseguire
il debugger basta scegliere
Run -> Debug As -> Java Applicationoppure usare la combinazione di tasti Shift+Alt+D J Quando viene raggiunto il primo breakpoint (senza guardia o la cui guardia sia soddisfatta), si aprirà la prospettiva di debug (previa vostra conferma), che presenta molte viste interessanti. La vista Debug (in alto a sinistra) mostra il contenuto della pila di esecuzione, dove compaiono tutte le istanze dei vari metodi attualmente sospesi (tipicamente quello in fondo alla pila sarà il metodo main e quello in cima alla pila il metodo contenente il breakpoint che è stato raggiunto). La vista Variables mostra le variabili locali del metodo e permette di ispezionarne il valore. Se le variabili riferiscono oggetti è possibile conoscere l'identificatore univoco del'oggetto (id = ...) e ispezionarne lo stato con un click sul triangolino che compare a sinistra del nome della variabile. Con un click del pulsante destro sul nome della variabile è possibile modificarne il contenuto prima di riprendere l'esecuzione.
|
![]() ![]() |
|
![]() ![]() |
L'esecuzione può essere riattivata con modalità diverse
associate alle icone che compaiono in cima alla vista di debug.
Il rettangolino giallo affiancato dal triangolo verde (Resume) riprende l'esecuzione normale fino al prossimo breakpoint impostato (o alla terminazione del programma). Il consueto quadratino rosso (Terminate) provoca la terminazione del programma. Sottolineiamo infine due importanti modalità single-step (indicate con diversi tipi di frecce gialle):
|
![]() ![]() |
|
![]() ![]() |
|
![]() ![]() |
|
![]() ![]() |
Per fare pratica con l'uso del debugger consideriamo due semplici
esempi riuniti nella classe TestDebug:
Calcolo del fattoriale ricorsivo. Lo scopo della demo è:
Ordinamento di un array. Lo scopo della demo è:
|