Usare i punti di interruzione nel debugger di Visual Studio

I punti di interruzione sono una delle tecniche di debug più importanti nella casella degli strumenti dello sviluppatore. È possibile impostare punti di interruzione ovunque si voglia sospendere l'esecuzione del debugger. Ad esempio, è possibile visualizzare lo stato delle variabili di codice o esaminare lo stack di chiamate in corrispondenza di un determinato punto di interruzione. Se si sta provando a risolvere un avviso o un problema durante l'uso dei punti di interruzione, vedere Risolvere i problemi relativi ai punti di interruzione nel debugger di Visual Studio.

Nota

Se si conosce l'attività o il problema che si sta tentando di risolvere, ma è necessario conoscere il tipo di punto di interruzione da usare, vedere Domande frequenti - Trovare la funzionalità di debug.

Impostare punti di interruzione nel codice sorgente

È possibile impostare un punto di interruzione in qualsiasi riga di codice eseguibile. Nel codice C# seguente, ad esempio, è possibile impostare un punto di interruzione sulla riga di codice con l'assegnazione di variabile (int testInt = 1), il for ciclo o qualsiasi codice all'interno del for ciclo. Non è possibile impostare un punto di interruzione per le firme dei metodi, le dichiarazioni per uno spazio dei nomi o una classe o dichiarazioni di variabili se non esiste alcuna assegnazione e nessun getter/setter.

Per impostare un punto di interruzione nel codice sorgente:

  • Fare clic sul margine all'estrema sinistra accanto a una riga di codice. È anche possibile selezionare la riga e premere F9, selezionare Attiva/Disattiva punto di interruzione oppure>fare clic con il pulsante destro del mouse e selezionare Punto di interruzione Inserisci punto> di interruzione. Il punto di interruzione viene visualizzato come punto rosso nel margine sinistro.

Per la maggior parte dei linguaggi, tra cui C#, i punti di interruzione e le righe di esecuzione correnti vengono evidenziati automaticamente. Per il codice C++, è possibile attivare l'evidenziazione del punto di interruzione e delle righe correnti selezionando Strumenti (o Debug) >Opzioni>Debug>Evidenzia l'intera riga di origine per i punti di interruzione e l'istruzione corrente (solo C++).

Set a breakpoint

Set a breakpoint

Quando si esegue il debug, l'esecuzione viene sospesa in corrispondenza del punto di interruzione, prima dell'esecuzione del codice in tale riga. Il simbolo del punto di interruzione mostra una freccia gialla.

Nel punto di interruzione nell'esempio seguente il valore di testInt è ancora 3. Il valore non è stato quindi modificato dopo l'inizializzazione della variabile (impostato su un valore 3) perché l'istruzione in giallo non è ancora stata eseguita.

Breakpoint execution stopped

Nel punto di interruzione nell'esempio seguente il valore di testInt è ancora 1. Il valore non è stato quindi modificato dopo l'inizializzazione della variabile (impostato su un valore 1) perché l'istruzione in giallo non è ancora stata eseguita.

Breakpoint execution stopped

Quando il debugger si arresta in corrispondenza del punto di interruzione, è possibile esaminare lo stato corrente dell'app, inclusi i valori delle variabili e lo stack di chiamate.

Ecco alcune istruzioni generali per l'uso dei punti di interruzione.

  • Il punto di interruzione è un interruttore. È possibile fare clic su di esso, premere F9 o usare Attiva>/Disattiva punto di interruzione per eliminare o reinserirlo.

  • Per disabilitare un punto di interruzione senza eliminarlo, passare il puntatore del mouse o fare clic con il pulsante destro del mouse su di esso e selezionare Disabilita punto di interruzione. I punti di interruzione disabilitati vengono visualizzati come punti vuoti nel margine sinistro o nella finestra Punti di interruzione . Per riabilitare un punto di interruzione, passare il puntatore del mouse o fare clic con il pulsante destro del mouse e selezionare Abilita punto di interruzione.

  • Impostare condizioni e azioni, aggiungere e modificare etichette oppure esportare un punto di interruzione facendo clic con il pulsante destro del mouse su di esso e selezionando il comando appropriato oppure passando il puntatore del mouse su di esso e selezionando l'icona Impostazioni.

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 Punto di interruzione Impostazioni. 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 altre informazioni sulle espressioni valide, vedere Espressioni nel debugger.

Per impostare una condizione del punto di interruzione:

  1. 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 e quindi selezionare Condizioni nella finestra Punto di interruzione Impostazioni.

    È 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 condizioni nella finestra Punti di interruzione facendo clic con il pulsante destro del mouse su un punto di interruzione e selezionando Impostazioni, quindi selezionando Condizioni

    Breakpoint settings

    Breakpoint settings

  2. Nell'elenco a discesa selezionare Espressione condizionale, Numero di passaggi o Filtro e impostare il valore di conseguenza.

  3. 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:

Breakpoint condition is true

Breakpoint condition is true

Nell'esempio seguente il punto di interruzione viene raggiunto solo quando viene modificato il valore di testInt :

Breakpoint When changed

Breakpoint When changed

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:

  1. Impostare un punto di interruzione nel codice dopo la creazione dell'oggetto.

  2. Avviare il debug e quando l'esecuzione viene sospesa nel punto di interruzione, selezionare Debug>variabili locali di Windows>(o premere CTRL + ALT + V, 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.

  3. 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.

  4. 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:

Breakpoint hit count

Breakpoint hit count

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:

  1. Selezionare Debug Nuovo>punto> di interruzione funzione punto di interruzione oppure premere CTRL + K, B.

    È anche possibile selezionare Nuovo>punto di interruzione funzione nella finestra Punti di interruzione.

  2. 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

  3. Nell'elenco a discesa Lingua scegliere la lingua della funzione.

  4. 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 .

  1. Impostare un punto di interruzione da qualche parte dopo la creazione di un'istanza della classe.

  2. Trovare l'indirizzo dell'istanza , ad esempio 0xcccccccc.

  3. Selezionare Debug Nuovo>punto> di interruzione funzione punto di interruzione oppure premere CTRL + K, B.

  4. 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:

  1. In un progetto .NET Core o .NET 5+ avviare il debug e attendere il raggiungimento di un punto di interruzione.

  2. 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.

    Managed Data Breakpoint

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:

  1. In un progetto C++ avviare il debug e attendere il raggiungimento di un punto di interruzione. Scegliere Nuovo punto di interruzione dati del punto> di interruzione dal menu Debug.

    È anche possibile selezionare Nuovo>punto 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.

  2. 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 variabile avar .

  3. 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:

  1. 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.

  2. 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 il punto di interruzione Impostazioni finestra. In alternativa, nella finestra Punti di interruzione scegliere OK per chiudere la finestra di dialogo. Dependent Breakpoint

È anche possibile usare il menu di scelta rapida del clic con il pulsante destro del mouse per impostare il punto di interruzione dipendente.

  1. 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.

    Dependentbreakpoint context

  • 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:

  1. 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.

  2. Scegliere Chiudi o premere CTRL+INVIO per chiudere il punto di interruzione Impostazioni finestra. In alternativa, nella finestra Punti di interruzione scegliere OK per chiudere la finestra di dialogo.

    Temporary breakpoint

È anche possibile usare il menu di scelta rapida del clic con il pulsante destro del mouse per impostare il punto di interruzione temporaneo.

  1. 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.

    Temporary breakpoint context

In alternativa, è sufficiente usare il collegamento F9 + MAIUSC + ALT, T e impostare il punto di interruzione temporaneo sulla riga desiderato.

Gestire i punti di interruzione nella finestra Punti di interruzione

È possibile usare la finestra Punti di interruzione per visualizzare e gestire tutti i punti di interruzione nella soluzione. Questa posizione centralizzata è particolarmente utile in una soluzione di grandi dimensioni o per scenari di debug complessi in cui i punti di interruzione sono critici.

Nella finestra Punti di interruzione è possibile cercare, ordinare, filtrare, abilitare/disabilitare o eliminare punti di interruzione. È anche possibile impostare condizioni e azioni oppure aggiungere una nuova funzione o un punto di interruzione dei dati.

Per aprire la finestra Punti di interruzione, selezionare Debug>punti di interruzione di Windows>o premere CTRL+ALT+B.

Breakpoints window

Breakpoints window

Per selezionare le colonne da visualizzare nella finestra Punti di interruzione , selezionare Mostra colonne. Selezionare un'intestazione di colonna per ordinare l'elenco dei punti di interruzione in base a tale colonna.

Etichette dei punti di interruzione

È possibile usare le etichette per ordinare e filtrare l'elenco dei punti di interruzione nella finestra Punti di interruzione .

  1. Per aggiungere un'etichetta a un punto di interruzione, fare clic con il pulsante destro del mouse sul punto di interruzione nel codice sorgente o nella finestra Punti di interruzione e quindi scegliere Modifica etichette. Aggiungere una nuova etichetta o sceglierne una esistente e quindi selezionare OK.
  2. Ordinare l'elenco dei punti di interruzione nella finestra Punti di interruzione selezionando etichette, condizioni o altre intestazioni di colonna. È possibile selezionare le colonne da visualizzare selezionando Mostra colonne sulla barra degli strumenti.

Esportare e importare punti di interruzione

Per salvare o condividere lo stato e la posizione dei punti di interruzione, è possibile esportarli o importarli.

  • Per esportare un singolo punto di interruzione in un file XML, fare clic con il pulsante destro del mouse sul punto di interruzione nella finestra codice sorgente o Punti di interruzione e selezionare Esporta o Esporta selezionato. Selezionare un percorso di esportazione e quindi selezionare Salva. Il percorso predefinito è la cartella della soluzione.
  • Per esportare diversi punti di interruzione, nella finestra Punti di interruzione selezionare le caselle accanto ai punti di interruzione oppure immettere i criteri di ricerca nel campo Cerca . Selezionare l'icona Esporta tutti i punti di interruzione corrispondenti all'icona dei criteri di ricerca corrente e salvare il file.
  • Per esportare tutti i punti di interruzione, deselezionare tutte le caselle e lasciare vuoto il campo Cerca . Selezionare l'icona Esporta tutti i punti di interruzione corrispondenti all'icona dei criteri di ricerca corrente e salvare il file.
  • Per importare punti di interruzione, nella finestra Punti di interruzione selezionare l'icona Importa punti di interruzione da un file , passare al percorso del file XML e selezionare Apri.

Impostare punti di interruzione dalle finestre del debugger

È anche possibile impostare punti di interruzione dalle finestre del debugger Stack di chiamate e Disassembly .

Impostare un punto di interruzione nella finestra Stack di chiamate

Per interrompere l'istruzione o la riga a cui torna una funzione chiamante, è possibile impostare un punto di interruzione nella finestra Stack di chiamate.

Per impostare un punto di interruzione nella finestra Stack di chiamate:

  1. Per aprire la finestra Stack di chiamate, è necessario essere sospesi durante il debug. Selezionare Debug>stack di chiamate di Windows>oppure premere CTRL+ALT+C.

  2. Nella finestra Stack di chiamate fare clic con il pulsante destro del mouse sulla funzione chiamante e scegliere Inserisci punto>di interruzione oppure premere F9.

    Accanto al nome della chiamata di funzione nel margine sinistro dello stack di chiamate viene visualizzato un simbolo di punto di interruzione.

Il punto di interruzione dello stack di chiamate viene visualizzato nella finestra Punti di interruzione come indirizzo, con un percorso di memoria che corrisponde all'istruzione eseguibile successiva nella funzione.

Il debugger si interrompe in corrispondenza dell'istruzione .

Per altre informazioni sullo stack di chiamate, vedere Procedura: Usare la finestra Stack di chiamate.

Per tracciare visivamente i punti di interruzione durante l'esecuzione del codice, vedere Eseguire il mapping dei metodi nello stack di chiamate durante il debug.

Impostare un punto di interruzione nella finestra Disassembly

  1. Per aprire la finestra Disassembly , è necessario essere sospesi durante il debug. Selezionare Debug>disassembly di Windows>oppure premere CTRL+ALT+D.

  2. Nella finestra Disassembly fare clic sul margine sinistro dell'istruzione da interrompere. È anche possibile selezionarlo e premere F9 oppure fare clic con il pulsante destro del mouse e selezionare Inserisci punto> di interruzione.