Condividi tramite


Nozioni fondamentali di debug: punti di interruzione

Aggiornamento: novembre 2007

Le informazioni contenute in questo argomento sono valide per:

Edition

Visual Basic

C#

C++

Web Developer

Express

Argomento applicabile Argomento applicabile Argomento applicabile Argomento applicabile

Standard

Argomento applicabile Argomento applicabile Argomento applicabile Argomento applicabile

Pro e Team

Argomento applicabile

Argomento applicabile

Argomento applicabile Argomento applicabile

Legenda tabella:

Argomento applicabile

Applicabile

Argomento non applicabile

Non applicabile

Argomento valido ma comando nascosto per impostazione predefinita

Comando o comandi nascosti per impostazione predefinita.

Un punto di interruzione è un segnale mediante il quale si indica al debugger di sospendere temporaneamente l'esecuzione del programma in un punto determinato. Quando l'esecuzione viene sospesa in corrispondenza di un punto di interruzione, il programma viene detto in modalità di interruzione. L'inserimento di un punto di interruzione non provoca la terminazione o la fine dell'esecuzione del programma, che può essere ripresa in qualsiasi momento.

La modalità di interruzione può essere paragonata a un timeout. Tutti gli elementi, quali funzioni, variabili e oggetti, rimangono in memoria, ma ne viene sospeso il funzionamento. In modalità di interruzione è possibile esaminare le posizioni e gli stati di tali elementi al fine di rilevare violazioni o errori. È inoltre possibile apportare modifiche al programma, ad esempio correggere 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 stesso quando è attivata la modalità di interruzione grazie a una potente funzionalità denominata Modifica e continuazione.

I punti di interruzione sono un efficace strumento che consente di sospendere l'esecuzione nel punto e nel momento opportuni. Invece di procedere all'esecuzione del codice riga per riga o istruzione per istruzione, è possibile farla continuare finché non venga rilevato un punto di interruzione, per poi avviare il debug. In questo modo si velocizza notevolmente il processo di debug. Senza questa funzionalità, sarebbe sostanzialmente 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, tra cui 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 genera una versione di rilascio del programma. Se si utilizzano istruzioni Stop, è necessario rimuovere manualmente tali istruzioni Stop prima di generare la versione di rilascio del programma oppure utilizzare istruzioni condizionali, come illustrato di seguito:

#If DEBUG Then
    Stop
#End If

Se si desidera disattivare temporaneamente un'istruzione Stop, è necessario individuarla all'interno del codice sorgente e impostarla come commento:

 ' Stop

Se l'istruzione Stop è una sola, non esiste alcun problema. Quando si effettua il debug di un programma di notevoli dimensioni con molte istruzioni Stop, tuttavia, la procedura di ricerca e impostazione come commento di ogni singola istruzione può richiedere molto tempo. Se si utilizzano i punti di interruzione, è invece possibile selezionarli e attivarli o disattivarli singolarmente o tutti 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 relativi alla posizione, con il debugger di Visual Studio sono disponibili, limitatamente al codice nativo, i punti di interruzione di dati. Un punto di interruzione di dati viene impostato su una variabile globale o locale, anziché in una posizione all'interno del 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 ottenere una flessibilità ancora maggiore, con il debugger di Visual Studio è possibile impostare alcune proprietà che modificano il comportamento di un punto di interruzione:

  • La proprietà Passaggi consente di specificare quante volte il punto di interruzione deve essere raggiunto prima che il debugger interrompa l'esecuzione. Per impostazione predefinita, il debugger interrompe l'esecuzione ogni volta che il punto di interruzione viene raggiunto. È possibile impostare il numero di passaggi in modo che il debugger interrompa l'esecuzione, ad esempio, ogni due volte che il punto di interruzione viene raggiunto oppure ogni dieci passaggi, ogni 512 passaggi o un qualsiasi altro numero di passaggi scelto. L'utilizzo di tale proprietà può essere vantaggioso, dal momento che alcuni errori 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 centinaia di iterazioni prima che un errore 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, che si stia effettuando 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 specifiche posizioni all'interno del codice e aggiungere a ciascuno di essi condizioni quali balance < 0. Una volta avviato il programma, la sua esecuzione verrà interrotta in quei punti solo quando il saldo sarà inferiore a zero. Sarà quindi possibile esaminare le variabili e lo stato del programma in corrispondenza del primo punto di interruzione, quindi continuare l'esecuzione fino al secondo 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 sceglie 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.

  • La proprietà 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. Nella 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

Altre risorse

Guida di orientamento al debugger