Nei capitoli precedenti ho esposto alcuni strumenti da usare durante la scrittura del sorgente, ma una volta scritto, bisogna testarlo
ed elimiare i bug, gli errori del programma. Questa operazione si dice debugging (dall'inglese de-bug).
Il componente più importante che si ha a disposizione è la finestra degli errori, nella quale vengono visualizzati tutti gli errori, gli warning e i messaggi. Prima di proseguire bisogna fare una distinzione tra le tre tipologie di notifiche esistenti:
- Errori : sono errori tutte le espressioni incomplete, l'incongruenza dei tipi dati con quelli richiesti, la mancanza di identificatori, la scrittura errata di un'istruzione, eccetera... Gli errori non permettono all'applicazione di correre in modo sicuro e portano nel 100% dei casi a un crash del programma. Il compilatore riesce ad individuare in modo semplice tutti quelli basati sulla sintassi, poiché si tratta semplicemente di confrontare schemi predefiniti con strutture date. Tutti gli errori vengono sottolineati in viola
- Warning : sono delle "avvertenze", percorsi di esecuzione che potrebbero condurre a un errore o a un loop, o semplicemente segnalazioni di metodi obsoleti o di variabili inutilizzate. Scovare questo tipo di aberrazioni nel codice è meno semplice e presuppone il cercare di considere un'evenienza e capire come il codice fluirà durante l'esecuzione. Il compilatore può individuare ad esempio che in una funzione, non tutti i percorsi di codice conducono a un risultato, oppure che un metodo richiama se stesso in un loop ricorsivo. Tutti gli warning vengono sottolineati in verde
- Messages : semplici messaggi del compilatore. Praticamente sempre assenti
Si può abilitare/disabilitare la visualizzazione di errori, warning o messaggi cliccando sul nome. Nella lista è possibile
raggiungere con un click su un elemento il punto del codice che ha generato l'errore.
I breakpoint sono punti in cui il programma si ferma, si mette in "pausa", mantenendo però i valori di tutte le variabili, per consentire
al programmatore di studiare cosa sta avvenendo all'interno dell'applicazione. Questo permette di scovare molti tipi di errori, sia di valore,
sia di logica. Per attivare un breakpoint, basta cliccare col mouse sul margine sinistro dell'editor di codice, nella parte grigia. La riga
selezionata verrà evidenziata e sarà posto un pallino rosso di fianco. Quando il codice arriva a quel punto, si ferma prima di
eseguire la riga selezionata e va in pausa, portando in primo piano il sorgente in questione ed evidenziandolo in giallo. Una volta giunti
a questo punto, si può controllare il valore di ogni variabile semplicemente posizionandovi sopra il mouse per alcuni decimi di secondo.
Ecco come potrebbe apparire una schermata in pausa:
In questo modo è possibile analizzare l'origine di ogni problema o comportamento strano. Se i valori delle variabili sono di tipo stringa
e sono anche piuttosto lunghi è possibile, con un doppio click sulla lente d'ingrandimento, visualizzarli in una finestra separata. Il
compilatore predispone anche due modalità di visualizzazione alternative: XML e HTML. Entrambe sono attivabili dal menù a
discesa accessibile cliccando sulla freccetta in giù vicino alla lente (al fianco di ogni stringa).
Inoltre, c'è un modo per aggiungere breakpoint da codice. Consiste nell'utilizzare la keyword Stop. Ad esempio:
'... If I = 50 Then Stop End If
Quando l'applicazione è in pausa, in basso a destra (usualmente), si apre una finestra che contiene i valori delle variabili in gioco.
È divisa in tre schede: la prima, Auto, contiene le variabili presenti sul breakpoint e quelle locali; la seconda, Local, contiene solo
le variabili locali; la terza, Watch, contiene le variabili il cui valore è stato forzatamente fatto analizzare dal programmatore.
Per aggiungere una variabile alla lista Watch bisogna trovarsi prima di tutto in modalità pausa, quindi si clicca con il pulsante
destro del mouse sulla variabile in questione e si sceglie "Add watch". Da questo momento in poi, ogni cambiamento della variabile verrà
registrato e monitorato, anche in pezzi di codice al di fuori del blocco in cui essa si trova. C'è anche un altro modo per ottenere
dei valori prima di un breakpoint, ossia la finestra Debug.
La finestra Debug è anche nota come Immediate Window ed è visibile solo in pausa, selezionando l'opportuna scheda nell'angolo in basso a destra. Al suo interno ci si può scrivere di tutto, qualsiasi informazione utile al debugging. Infatti si usa l'oggetto singleton Debug come se fosse un oggetto Console, e l'output viene scritto, appunto, sulla finestra. Ad esempio:
Module Module1 Sub Main() Dim P As New Person("Pinco", "Pallino", New Date(2008, 1, 1)) '... Debug.WriteLine("Nome completo: " & P.CompleteName) 'Si possono scrivere messaggi solo se vige una certa condizione Debug.WriteLineIf(P.BirthDay > New Date(2007, 9, 27), _ "Data di nascita posteriore al 27/9/2007") If P IsNot Nothing Then Stop End If Console.ReadKey() End Sub End Module