Usare il tipo corretto di punto di interruzione
Questo articolo illustra come usare diversi tipi di punti di interruzione in Visual Studio per migliorare l'efficienza del debug. Vengono illustrati vari scenari in cui è possibile applicare punti di interruzione, ad esempio sospendere l'esecuzione del codice, registrare le informazioni e tenere traccia delle modifiche negli stati delle variabili. L'articolo illustra come impostare punti di interruzione condizionali, punti di tracciamento, punti di interruzione dei dati, punti di interruzione dipendenti e punti di interruzione temporanei. Include anche istruzioni dettagliate sull'impostazione dei punti di interruzione della funzione. Questa guida è essenziale per gli sviluppatori che cercano di sfruttare i punti di interruzione per un debug efficace in Visual Studio.
Se non si ha familiarità con l'uso di punti di interruzione in Visual Studio, vedere Introduzione ai punti di interruzione prima di eseguire questo articolo.
Per un'esperienza ottimale con questa documentazione, scegliere il linguaggio di sviluppo o il runtime preferito dall'elenco nella parte superiore dell'articolo.
Scenari
La tabella seguente illustra gli scenari di debug comuni per i punti di interruzione e il tipo di punto di interruzione consigliato per lo scenario.
Sceneggiatura | Descrizione |
---|---|
Come si sospende l'esecuzione del codice per esaminare una riga di codice che potrebbe contenere un bug? | Impostare un punto di interruzione. Per altre informazioni, vedere Introduzione ai punti di interruzione. |
La variabile ha un valore imprevisto? Oppure, voglio ispezionare la mia app quando raggiunge uno stato specifico? | Provare un punto di interruzione condizionale per controllare dove e quando un punto di interruzione viene attivato usando la logica condizionale. Fare clic con il pulsante destro del mouse su un punto di interruzione per aggiungere condizioni. Impostare la condizione su true quando la variabile è uguale al valore imprevisto. Per altre informazioni, vedere condizioni del punto di interruzione. |
Come registrare le informazioni nella finestra Output in condizioni configurabili senza modificare o arrestare il codice? | I punti di traccia consentono di registrare le informazioni nella finestra Output in condizioni configurabili senza modificare o arrestare il codice. Per altre informazioni, vedere Usare i tracepoint nel debugger di Visual Studio. |
Come è possibile sapere quando cambia il valore della variabile? | Per C++, impostare un punto di interruzione dei dati . Per le app che usano .NET Core 3 e versioni successive, è anche possibile impostare un punto di interruzione dei dati . In caso contrario, solo per C# e F# è possibile tenere traccia di un ID oggetto con un punto di interruzione condizionale. |
Come si interrompe l'esecuzione solo se viene raggiunto un altro punto di interruzione? | Impostare un punto di interruzione dipendente che interrompe l'esecuzione solo se viene raggiunto un altro punto di interruzione. Per altre informazioni, vedere punto di interruzione dipendente. |
È possibile raggiungere un punto di interruzione una sola volta? | Impostare un punto di interruzione temporaneo che consente di interrompere il codice una sola volta. Per altre informazioni, vedere punto di interruzione temporaneo. |
È possibile sospendere il codice all'interno di un ciclo in una determinata iterazione? | Impostare un punto di interruzione dipendente che interrompe l'esecuzione solo se viene raggiunto un altro punto di interruzione. Per ulteriori informazioni, vedere conteggio dei colpi. |
È possibile sospendere il codice all'inizio di una funzione quando si conosce il nome della funzione ma non la posizione? | A tale scopo, è possibile usare un punto di interruzione della funzione. Per altre informazioni, vedere Impostare i punti di interruzione delle funzioni. |
È possibile sospendere il codice all'inizio di più funzioni con lo stesso nome? | Quando si dispone di più funzioni con lo stesso nome (funzioni sovraccaricate o funzioni in progetti diversi), è possibile usare un punto di interruzione per le funzioni . |
Azioni e punti di interruzione
Un punto di analisi è un punto di interruzione che visualizza un messaggio nella finestra Output. Un punto di traccia può agire come un'istruzione di traccia temporanea nel linguaggio di programmazione e non sospende l'esecuzione del codice. Per creare un punto di traccia, impostare un'azione speciale nella finestra Impostazioni punto di interruzione. Per istruzioni dettagliate, vedere Usare i punti di traccia nel debugger di Visual Studio.
Condizioni punto di interruzione
È possibile controllare dove e quando un punto di interruzione viene eseguito impostando le condizioni. La condizione può essere qualsiasi espressione valida riconosciuta dal debugger. Per ulteriori informazioni sulle espressioni valide, vedere Espressioni nel debugger.
Per impostare una condizione del punto di interruzione:
Fare clic con il pulsante destro del mouse sul simbolo del punto di interruzione e selezionare Condizioni (oppure premere ALT + F9, C). In alternativa, passare il puntatore del mouse sul simbolo del punto di interruzione, selezionare l'icona Impostazioni impostazioni e quindi selezionare Condizioni nella finestra Impostazioni punto di interruzione.
È anche possibile fare clic con il pulsante destro del mouse sul margine sinistro accanto a una riga di codice e scegliere Inserisci punto di interruzione condizionale dal menu di scelta rapida per impostare un nuovo punto di interruzione condizionale.
È anche possibile impostare le condizioni nella finestra Punti di interruzione facendo clic con il pulsante destro del mouse su un punto di interruzione e scegliendo Impostazioni, quindi selezionando Condizioni
Nell'elenco a discesa selezionare Espressione condizionale, Numero di passaggi o Filtro e impostare il valore di conseguenza.
Selezionare Chiudi o premere CTRL+INVIO per chiudere la finestra Impostazioni punto di interruzione. In alternativa, nella finestra Punti di interruzione selezionare OK per chiudere la finestra di dialogo.
I punti di interruzione con set di condizioni vengono visualizzati con un + simbolo nelle finestre codice sorgente e Punti di interruzione .
Creare un'espressione condizionale
Quando si seleziona Espressione condizionale, è possibile scegliere tra due condizioni: True o Quando viene modificato. Scegliere True per interrompere quando l'espressione viene soddisfatta o Quando viene modificata per interrompere quando il valore dell'espressione è stato modificato.
Nell'esempio seguente il punto di interruzione viene raggiunto solo quando il valore di testInt
è 4:
Nell'esempio seguente il punto di interruzione viene raggiunto solo quando viene modificato il valore di testInt
:
Se si imposta una condizione del punto di interruzione con sintassi non valida, viene visualizzato un messaggio di avviso. Se viene specificata una condizione del punto di interruzione con sintassi valida ma con semantica non valida, viene visualizzato un messaggio di avviso la prima volta che si raggiunge il punto di interruzione. In entrambi i casi, il debugger si interrompe quando raggiunge il punto di interruzione non valido. Il punto di interruzione viene ignorato solo se la condizione è valida e restituisce false
.
Nota
Per il campo Quando modificato , il debugger non considera la prima valutazione della condizione come una modifica, quindi non raggiunge il punto di interruzione nella prima valutazione.
Usare GLI ID oggetto nelle espressioni condizionali (solo C# e F#)
In alcuni casi si vuole osservare il comportamento di un oggetto specifico. Ad esempio, è possibile scoprire perché un oggetto è stato inserito in una raccolta più di una volta. In C# e F# è possibile creare ID oggetto per istanze specifiche dei tipi riferimento e usarle nelle condizioni del punto di interruzione. L'ID oggetto viene generato dai servizi di debug di Common Language Runtime (CLR) e associato all'oggetto.
Per creare un ID oggetto:
Impostare un punto di interruzione nel codice dopo la creazione dell'oggetto.
Avviare il debug e quando l'esecuzione viene sospesa nel punto di interruzione, selezionare >variabili locali di Windows>(o premere CTRL + , L) per aprire la finestra Variabili locali.
Trovare l'istanza dell'oggetto specifica nella finestra Variabili locali, fare clic con il pulsante destro del mouse e scegliere Crea ID oggetto.
Nella finestra $ verrà visualizzato il simbolo Variabili locali . Si tratta dell'ID oggetto.
Aggiungere un nuovo punto di interruzione al punto da analizzare; ad esempio, quando l'oggetto deve essere aggiunto all'insieme. Fare clic con il pulsante destro del mouse sul punto di interruzione e scegliere Condizioni.
Usare l'ID oggetto nel campo Espressione condizionale. Ad esempio, se la variabile
item
è l'oggetto da aggiungere alla raccolta, selezionare True e digitare item == $<n>, dove <n> è il numero ID oggetto.L'esecuzione si interromperà in corrispondenza del punto in cui l'oggetto deve essere aggiunto alla raccolta.
Per eliminare l'ID oggetto, fare clic con il pulsante destro del mouse sulla variabile nella finestra Variabili locali e scegliere Elimina ID oggetto.
Nota
Gli ID oggetto creano riferimenti deboli e non impediscono all'oggetto di essere sottoposto a Garbage Collection. Sono validi solo per la sessione di debug corrente.
Impostare una condizione di hit count
Se si sospetta che un ciclo nel codice inizi a comportarsi in modo errato dopo un determinato numero di iterazioni, è possibile impostare un punto di interruzione per arrestare l'esecuzione dopo tale numero di riscontri, invece di dover premere ripetutamente F5 per raggiungere tale iterazione.
In Condizioni nella finestra Impostazioni punto di interruzione selezionare Numero di passaggi e quindi specificare il numero di iterazioni. Nell'esempio seguente il punto di interruzione viene impostato su ogni altra iterazione:
Impostare una condizione di filtro
È possibile limitare un punto di interruzione da attivare solo su dispositivi specificati o in thread e processi specificati.
In Condizioni nella finestra Impostazioni punto di interruzione selezionare Filtro e quindi immettere una o più delle espressioni seguenti:
- MachineName = "name"
- ProcessId = value
- ProcessName = "name"
- ThreadId = value
- ThreadName = "name"
Racchiudere i valori String tra virgolette doppie. È possibile combinare clausole usando &
(AND), ||
(OR), !
(NOT) e le parentesi.
Impostare i punti di interruzione della funzione
È possibile interrompere l'esecuzione quando viene chiamata una funzione. Ciò è utile, ad esempio, quando si conosce il nome della funzione ma non la relativa posizione. È utile anche se si dispone di funzioni con lo stesso nome e si vuole interrompere tutte le funzioni ,ad esempio funzioni di overload o funzioni in progetti diversi.
Per impostare un punto di interruzione della funzione:
Selezionare Debug Nuovo>> di interruzione funzione punto di interruzione oppure premere CTRL + K, B.
È anche possibile selezionare Nuovo> di interruzione funzione nella finestra Punti di interruzione.
Nella finestra di dialogo Nuovo punto di interruzione funzione immettere il nome della funzione nella casella Nome funzione.
Per restringere la specifica della funzione:
Usare il nome completo della funzione.
Esempio:
Namespace1.ClassX.MethodA()
Aggiungere i tipi di parametro di una funzione di overload.
Esempio:
MethodA(int, string)
Usare il simbolo '!' per specificare il modulo.
Esempio:
App1.dll!MethodA
Usare l'operatore di contesto in C++nativo.
{function, , [module]} [+<line offset from start of method>]
Esempio:
{MethodA, , App1.dll}+2
Nell'elenco a discesa Lingua scegliere la lingua della funzione.
Seleziona OK.
Impostare un punto di interruzione di funzione usando un indirizzo di memoria (solo C++ nativo)
È possibile utilizzare l'indirizzo di un oggetto per impostare un punto di interruzione di funzione su un metodo chiamato da un'istanza specifica di una classe. Ad esempio, dato un oggetto indirizzabile di tipo my_class
, è possibile impostare un punto di interruzione della funzione nel metodo che chiama l'istanza my_method
.
Impostare un punto di interruzione da qualche parte dopo la creazione di un'istanza della classe.
Trovare l'indirizzo dell'istanza , ad esempio
0xcccccccc
.Selezionare Debug Nuovo>> di interruzione funzione punto di interruzione oppure premere CTRL + K, B.
Aggiungere quanto segue alla casella Nome funzione e selezionare Linguaggio C++ .
((my_class *) 0xcccccccc)->my_method
Impostare i punti di interruzione dei dati (.NET Core 3.x o .NET 5+)
I punti di interruzione dei dati interrompono l'esecuzione quando cambia la proprietà di un oggetto specifico.
Per impostare un punto di interruzione dei dati:
In un progetto .NET Core o .NET 5+ avviare il debug e attendere il raggiungimento di un punto di interruzione.
Nella finestra Auto, Espressione di controllo o Variabili locali fare clic con il pulsante destro del mouse su una proprietà e scegliere Interrompi quando il valore cambia nel menu di scelta rapida.
I punti di interruzione dei dati per .NET Core e .NET 5+ non funzioneranno per:
- Proprietà che non sono espandibili nella descrizione comando, variabili locali, auto o finestra Espressione di controllo
- Variabili statiche
- Classi con l'attributo DebuggerTypeProxy
- Campi all'interno di struct
Per il numero massimo che è possibile impostare, vedere Limiti hardware del punto di interruzione dei dati.
Impostare punti di interruzione dei dati (solo C++ nativo)
I punti di interruzione dei dati interrompono l'esecuzione quando viene modificato un valore archiviato in un indirizzo di memoria specificato. Se il valore viene letto ma non modificato, l'esecuzione non viene interrotta.
Per impostare un punto di interruzione dei dati:
In un progetto C++ avviare il debug e attendere il raggiungimento di un punto di interruzione. Scegliere Nuovo punto di interruzione dati del punto>dal menu Debug.
È anche possibile selezionare Nuovo> di interruzione dati nella finestra Punti di interruzione oppure fare clic con il pulsante destro del mouse su un elemento nella finestra Auto, Espressione di controllo o Variabili locali e scegliere Interrompi quando il valore cambia nel menu di scelta rapida.
Nella casella Indirizzo digitare un indirizzo di memoria o un'espressione che restituisca un indirizzo di memoria. Ad esempio, digitare
&avar
per eseguire l'interruzione quando viene modificato il contenuto della variabileavar
.Nell'elenco a discesa Conteggio byte selezionare il numero di byte che si desidera controllare tramite il debugger. Ad esempio, se si seleziona 4, il debugger controllerà i quattro byte a partire da
&avar
e si interromperà se viene modificato il valore di uno di questi byte.
I punti di interruzione dei dati non funzionano nelle condizioni seguenti:
- Un processo di cui non viene eseguito il debug scrive nella posizione di memoria.
- La posizione di memoria è condivisa tra due o più processi.
- La posizione di memoria viene aggiornata all'interno del kernel. Ad esempio, se la memoria viene passata alla funzione Windows
ReadFile
a 32 bit, la memoria verrà aggiornata dalla modalità kernel, quindi il debugger non verrà interrotto nell'aggiornamento. - Dove l'espressione watch è maggiore di 4 byte su hardware a 32 bit e 8 byte su hardware a 64 bit. Si tratta di una limitazione dell'architettura x86.
Nota
I punti di interruzione dei dati dipendono da indirizzi di memoria specifici. L'indirizzo di una variabile cambia da una sessione di debug alla successiva, quindi i punti di interruzione dei dati vengono disabilitati automaticamente alla fine di ogni sessione di debug.
Se si imposta un punto di interruzione dei dati in una variabile locale, il punto di interruzione resta abilitato quando la funzione termina, ma l'indirizzo di memoria non è più applicabile, pertanto il comportamento del punto di interruzione è imprevedibile. Se si imposta un punto di interruzione di dati in una variabile locale, è necessario eliminare o disabilitare il punto di interruzione prima del termine della funzione.
Limiti hardware dei punti di interruzione dei dati
Il kernel Windows e l'hardware sottostante hanno i limiti seguenti quando si impostano punti di interruzione dei dati. Il limite si riferisce al numero massimo di punti di interruzione dei dati che è possibile impostare.
Architettura del processore | Limite dei punti di interruzione dei dati |
---|---|
x64 e x86 | 4 |
ARM64 | 2 |
ARM | 1 |
Impostare un punto di interruzione dipendente
I punti di interruzione dipendenti interrompono l'esecuzione solo se viene raggiunto un altro punto di interruzione. Pertanto, in uno scenario complesso, ad esempio il debug di un'applicazione multithread, è possibile configurare i punti di interruzione aggiuntivi dopo che viene raggiunto un altro punto di interruzione. Questo può rendere il codice di debug in percorsi comuni, ad esempio un ciclo di gioco o un'API di utilità molto più semplice perché un punto di interruzione in tali funzioni può essere configurato per abilitare solo se la funzione viene richiamata da una parte specifica dell'applicazione.
Per impostare un punto di interruzione dipendente:
Passare il puntatore del mouse sul simbolo del punto di interruzione, scegliere l'icona Impostazioni e quindi selezionare Abilita solo quando viene raggiunto il punto di interruzione seguente nella finestra Impostazioni punto di interruzione.
Nell'elenco a discesa selezionare il punto di interruzione dei prerequisiti da cui si vuole che il punto di interruzione corrente sia dipendente.
Scegliere Chiudi o premere CTRL+INVIO per chiudere la finestra Impostazioni punto di interruzione. In alternativa, nella finestra Punti di interruzione scegliere OK per chiudere la finestra di dialogo.
È anche possibile usare il menu di scelta rapida del clic con il pulsante destro del mouse per impostare il punto di interruzione dipendente.
Fare clic con il pulsante destro del mouse sul margine sinistro accanto a una riga di codice e scegliere Inserisci punto di interruzione dipendente dal menu di scelta rapida.
- I punti di interruzione dipendenti non funzionano se nell'applicazione è presente un solo punto di interruzione.
- I punti di interruzione dipendenti vengono convertiti in normali punti di interruzione di riga se il punto di interruzione dei prerequisiti viene eliminato.
Impostare un punto di interruzione temporaneo
Questo punto di interruzione consente di interrompere il codice una sola volta. Durante il debug, il debugger di Visual Studio sospende l'applicazione in esecuzione una sola volta per questo punto di interruzione e quindi la rimuove immediatamente dopo che è stata raggiunta.
Per impostare un punto di interruzione temporaneo:
Passare il puntatore del mouse sul simbolo del punto di interruzione, scegliere l'icona Impostazioni e quindi selezionare Rimuovi punto di interruzione una volta raggiunto nella finestra Impostazioni punto di interruzione.
Scegliere Chiudi o premere CTRL+INVIO per chiudere la finestra Impostazioni punto di interruzione. In alternativa, nella finestra Punti di interruzione scegliere OK per chiudere la finestra di dialogo.
È anche possibile usare il menu di scelta rapida del clic con il pulsante destro del mouse per impostare il punto di interruzione temporaneo.
Fare clic con il pulsante destro del mouse sul margine sinistro accanto a una riga di codice e scegliere Inserisci punto di interruzione temporaneo dal menu di scelta rapida.
In alternativa, è sufficiente usare il collegamento F9 + MAIUSC + ALT, T e impostare il punto di interruzione temporaneo sulla riga desiderato.