Nozioni fondamentali di debug: punti di interruzione
Le informazioni contenute in questo argomento sono valide per:
Edizione |
Visual Basic |
C# |
F# |
C++ |
Web Developer |
---|---|---|---|---|---|
Express |
|||||
Pro, Premium e Ultimate |
Un punto di interruzione è un segnale che indica al debugger di sospendere temporaneamente l'esecuzione del programma in corrispondenza di un determinato punto. Quando l'esecuzione viene sospesa in corrispondenza di un punto di interruzione, il programma viene detto in modalità di interruzione. L'attivazione della modalità di interruzione non comporta l'arresto né la fine dell'esecuzione del programma; è possibile riprendere l'esecuzione in qualsiasi momento.
La modalità di interruzione può essere paragonata a un timeout. Tutti gli elementi restano (funzioni, variabili e oggetti restano ad esempio in memoria), ma ne vengono sospesi il movimento e le attività. In modalità di interruzione è possibile esaminare le posizioni e gli stati degli elementi al fine di rilevare violazioni o bug. In modalità di interruzione è anche possibile apportare modifiche al programma, ad esempio modificare il valore di una variabile. È possibile spostare il punto di esecuzione, in modo da cambiare l'istruzione che verrà eseguita al momento della ripresa dell'esecuzione del programma. In C++, C# e Visual Basic è persino possibile modificare il codice in modalità di interruzione, utilizzando una funzionalità alquanto efficace denominata Modifica e continuazione.
I punti di interruzione sono un efficace strumento che consente di sospendere l'esecuzione nel punto e nel momento opportuni. Anziché scorrere il codice riga per riga o istruzione per istruzione, è possibile consentire l'esecuzione del programma fino a che non viene rilevato un punto di interruzione, quindi avviare il debug. In questo modo si velocizza il processo di debug. Senza questa possibilità, sarebbe pressoché impossibile eseguire il debug di un programma di notevoli dimensioni.
In molti linguaggi di programmazione sono disponibili istruzioni o costrutti che consentono di sospendere l'esecuzione del programma e di attivare la modalità di interruzione. In Visual Basic, ad esempio, è disponibile l'istruzione Stop. I punti di interruzione differiscono da questo genere di istruzioni, in quanto non consistono propriamente in codice sorgente da aggiungere al programma. Non vi è alcuna istruzione ad essi relativa da immettere in una finestra di origine. La richiesta di impostazione di un punto di interruzione viene inviata tramite l'interfaccia del debugger, per poi essere automaticamente soddisfatta. Per inserire un punto di interruzione di riga, fare clic sul margine grigio accanto alla riga desiderata. I punti di interruzione più complessi possono essere gestiti tramite una finestra Punti di interruzione completa.
I punti di interruzione presentano numerosi vantaggi rispetto ai costrutti di debug quali l'istruzione Stop di Visual Basic. Possono infatti essere eliminati o modificati senza dover modificare il codice sorgente del programma. Dal momento che non sono istruzioni, non producono mai codice aggiuntivo quando si compila una versione di rilascio del programma. Se si utilizzano istruzioni Stop nel programma, è necessario rimuovere manualmente tali istruzioni Stop prima di compilare la versione di rilascio, oppure si devono utilizzare istruzioni condizionali, come illustrato di seguito:
#If DEBUG Then
Stop
#End If
Per disabilitare temporaneamente un'istruzione Stop, è necessario individuarla nel codice sorgente e impostarla come commento:
' Stop
Se l'istruzione Stop è una sola, non esiste alcun problema. Tuttavia, se si esegue il debug di un programma di dimensioni notevoli contenente molte istruzioni Stop, la procedura di ricerca e impostazione come commento di ogni singola istruzione può richiedere molto tempo. Utilizzando i punti di interruzione, è invece possibile selezionare e disabilitare o abilitare ogni singolo punto di interruzione o tutti i punti contemporaneamente nella finestra Punti di interruzione.
Infine, un grande vantaggio offerto dai punti di interruzione rispetto alle istruzioni Stop è la flessibilità. Un'istruzione Stop causa un'interruzione dell'esecuzione del programma in corrispondenza della riga di codice sorgente in cui è stata inserita. Per ottenere il medesimo risultato, è possibile impostare un punto di interruzione su una riga di codice sorgente. In alternativa, è anche possibile impostare un punto di interruzione su una funzione o un indirizzo di memoria, operazione non consentita dalle istruzioni Stop. Oltre a questi punti di interruzione del percorso, il debugger di Visual Studio offre, limitatamente al codice nativo, i punti di interruzione dei dati. Un punto di interruzione dei dati viene impostato su una variabile globale o locale, anziché su un percorso nel codice. Mediante l'impostazione di un punto di interruzione di dati si ottiene l'interruzione dell'esecuzione del codice non appena il valore della variabile cambia.
Per una flessibilità ancora maggiore, il debugger di Visual Studio consente di impostare proprietà che modificano il comportamento di un punto di interruzione:
La proprietà Passaggi consente di specificare quante volte deve essere raggiunto il punto di interruzione prima che il debugger interrompa l'esecuzione. Per impostazione predefinita, il debugger interrompe l'esecuzione ogni volta che viene raggiunto il punto di interruzione. È possibile impostare un numero di passaggi in modo che il debugger interrompa l'esecuzione ogni due volte che il punto di interruzione viene raggiunto, oppure ogni 10 passaggi, ogni 512 passaggi o un qualsiasi altro numero di passaggi scelto. L'utilizzo di tale proprietà può essere vantaggioso, dal momento che alcuni bug non compaiono la prima volta che viene eseguito un ciclo, che viene chiamata una funzione o che si accede a una variabile. Talvolta, possono essere necessarie cento o mille iterazioni prima che un bug faccia la sua comparsa. Per effettuare il debug di un problema di tal genere, è possibile impostare un punto di interruzione e un numero di passaggi opportunamente elevato.
La proprietà Condizione è un'espressione che consente di determinare se il punto di interruzione deve essere raggiunto o ignorato. Quando il debugger raggiunge il punto di interruzione, la condizione verrà valutata. Il punto di interruzione verrà raggiunto solo se la condizione viene soddisfatta. È possibile utilizzare una condizione con un punto di interruzione di posizione affinché l'esecuzione venga interrotta in un punto specifico solo quando una determinata condizione viene soddisfatta. Si supponga, ad esempio, di eseguire il debug di un programma per operazioni bancarie in cui il saldo del conto non può scendere al di sotto dello zero. È possibile impostare punti di interruzione in determinate posizioni all'interno del codice e aggiungere a ciascuno di essi una condizione quale balance < 0. Una volta avviato il programma, la sua esecuzione verrà interrotta in quei punti solo quando il saldo sarà inferiore a zero. Sarà possibile esaminare le variabili e lo stato del programma in corrispondenza della prima posizione del punto di interruzione, quindi continuare l'esecuzione fino alla seconda posizione del punto di interruzione e così via.
La proprietà Azione consente di specificare un'operazione da eseguire quando viene raggiunto il punto di interruzione. Per impostazione predefinita, il debugger interrompe l'esecuzione, ma è possibile scegliere di visualizzare un messaggio oppure di eseguire una macro di Visual Studio. Se si decide di visualizzare un messaggio anziché interrompere l'esecuzione, il punto di interruzione avrà un effetto molto simile a un'istruzione Trace. Questa modalità di utilizzo dei punti di interruzione è nota come punti di analisi.
Filtro consente di specificare un processo o un thread per il punto di interruzione.
Nota
Una tecnica particolarmente utile consiste nell'impostazione di punti di interruzione nella finestra Stack di chiamate. Utilizzando la finestra Stack di chiamate è possibile impostare un punto di interruzione su una particolare chiamata di funzione. Questa operazione può essere particolarmente vantaggiosa quando si effettua il debug di una funzione ricorsiva, ovvero di una funzione che chiama se stessa. Se si interrompe l'esecuzione dopo un certo numero di chiamate, è possibile utilizzare la finestra Stack di chiamate per impostare un punto di interruzione su una chiamata precedente non ancora restituita. Il debugger raggiungerà il punto di interruzione e interromperà l'esecuzione in corrispondenza dell'uscita delle chiamate correnti.
Vedere anche
Attività
Procedura: utilizzare la finestra Punti di interruzione
Concetti
Punti di interruzione e punti di analisi
Punti di interruzione e punti di analisi