Utilizzare i punti di interruzione nel debugger di Visual Studio

  • 06/30/2020
  • 12 minuti a leggere
    • M
    • g
    • j
    • v
    • g
    • +8

i punti di Interruzione sono una delle più importanti tecniche di debug nel vostro sviluppatore di strumenti. È possibile impostare i punti di interruzione ovunque si desideri mettere in pausa l’esecuzione del debugger. Ad esempio, potresti voler vedere lo stato delle variabili di codice o guardare lo stack di chiamate in un determinato punto di interruzione. Se si sta tentando di risolvere un avviso o un problema durante l’utilizzo dei punti di interruzione, vedere Risoluzione dei problemi dei punti di interruzione nel debugger di Visual Studio.

Nota

Se conosci l’attività o il problema che stai cercando di risolvere, ma devi sapere che tipo di punto di interruzione usare, vedi FAQ – Trova la tua funzione di debug.

Imposta i punti di interruzione nel codice sorgente

È possibile impostare un punto di interruzione su qualsiasi riga di codice eseguibile. Ad esempio, nel seguente codice c#, è possibile impostare un punto di interruzione sulla riga di codice con l’assegnazione variabile (int testInt = 1), il ciclo for o qualsiasi codice all’interno del ciclo for. Non è possibile impostare un punto di interruzione sulle firme dei metodi, sulle dichiarazioni per uno spazio dei nomi o una classe o sulle dichiarazioni delle variabili se non vi è 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. È inoltre possibile selezionare la linea e premere F9, selezionare Debug > Toggle Breakpoint, o fare clic destro e selezionare Breakpoint > Inserisci breakpoint. Il punto di interruzione appare come un punto rosso nel margine sinistro.

Per la maggior parte delle lingue, tra cui c#, le linee di breakpoint e di esecuzione corrente vengono evidenziate 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 sorgente per i punti di interruzione e l’istruzione corrente (solo C++).

Imposta un punto di interruzione

Quando si esegue il debug, l’esecuzione si interrompe al punto di interruzione, prima che il codice su quella riga venga eseguito. Il simbolo del punto di interruzione mostra una freccia gialla.

Al punto di interruzione nell’esempio seguente, il valore di testInt è ancora 1. Quindi, il valore non è cambiato da quando la variabile è stata inizializzata (impostata su un valore di 1) perché l’istruzione in giallo non è ancora stata eseguita.

Esecuzione del punto di interruzione interrotta

Quando il debugger si arresta al 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 lavorare con i punti di interruzione.

  • Il punto di interruzione è un interruttore. È possibile fare clic su di esso, premere F9 o utilizzare Debug > Toggle Breakpoint per eliminarlo o reinserirlo.

  • Per disabilitare un punto di interruzione senza eliminarlo, passa il mouse sopra o fai clic con il pulsante destro del mouse e seleziona Disattiva punto di interruzione. I punti di interruzione disabilitati vengono visualizzati come punti vuoti nel margine sinistro o nella finestra Punti di interruzione. Per riattivare un punto di interruzione, passare il mouse sopra o fare clic con il pulsante destro del mouse e selezionare Abilita punto di interruzione.

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

Azioni breakpoint e punti di interruzione

Un punto di interruzione è un punto di interruzione che stampa un messaggio nella finestra di output. Un tracepoint può agire come un’istruzione di traccia temporanea nel linguaggio di programmazione e non mette in pausa l’esecuzione del codice. È possibile creare un punto di traccia impostando un’azione speciale nella finestra Impostazioni punto di interruzione. Per istruzioni dettagliate, vedere Utilizzare i punti di traccia nel debugger di Visual Studio.

Condizioni del punto di interruzione

È possibile controllare quando e dove viene eseguito un punto di interruzione 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 di breakpoint:

  1. Fare clic con il pulsante destro del mouse sul simbolo del punto di interruzione e selezionare Condizioni (oppure premere Alt + F9, C). Oppure passare il mouse sopra il simbolo del punto di interruzione, selezionare l’icona Impostazioni e quindi selezionare Condizioni nella finestra Impostazioni punto di interruzione.

    È anche possibile impostare le 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.

     Impostazioni punto di interruzione

  2. Nel menu a discesa, selezionare Espressione condizionale, Conteggio hit o Filtro e impostare il valore di conseguenza.

  3. Selezionare Chiudi o premere Ctrl + Invio per chiudere la finestra Impostazioni punto di interruzione. Oppure, dalla finestra Punti di interruzione, selezionare OK per chiudere la finestra di dialogo.

I punti di interruzione con le condizioni impostate 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: È vero o Quando modificato. Choose è true per interrompere quando l’espressione è soddisfatta o Quando viene modificata per interrompere quando il valore dell’espressione è cambiato.

Nell’esempio seguente, il punto di interruzione viene raggiunto solo quando il valore di testInt è 4:

 La condizione del punto di interruzione è true

Nell’esempio seguente, il punto di interruzione viene colpito solo quando il valore di testInt cambia:

Breakpoint Quando viene modificato

Se si imposta una condizione di breakpoint con sintassi non valida, viene visualizzato un messaggio di avviso. Se si specifica una condizione del punto di interruzione con sintassi valida ma semantica non valida, viene visualizzato un messaggio di avviso la prima volta che viene colpito il punto di interruzione. In entrambi i casi, il debugger si interrompe quando colpisce il punto di interruzione non valido. Il punto di interruzione viene saltato solo se la condizione è valida e viene valutata a 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.

Usa gli ID oggetto nelle espressioni condizionali (solo C# e F#)

Ci sono momenti in cui vuoi osservare il comportamento di un oggetto specifico. Ad esempio, potresti voler scoprire perché un oggetto è stato inserito in una raccolta più di una volta. In C # e F#, è possibile creare ID oggetto per istanze specifiche di tipi di riferimento e utilizzarli in condizioni di punto di interruzione. L’ID oggetto viene generato dai servizi di debug Common Language Runtime (CLR) e associato all’oggetto.

Per creare un ID Oggetto:

  1. Imposta un punto di interruzione nel codice in qualche punto dopo che l’oggetto è stato creato.

  2. Avviare il debug e, quando l’esecuzione si interrompe al punto di interruzione, selezionare Debug > Windows > Locals (o premere Ctrl + Alt + V, L) per aprire la finestra Locals.

    Trova l’istanza dell’oggetto specifico nella finestra Locals, fai clic con il pulsante destro del mouse e seleziona Crea ID oggetto.

    Dovresti vedere un $ più un numero nella finestra Locals. Questo è l’ID oggetto.

  3. Aggiungere un nuovo punto di interruzione nel punto che si desidera esaminare; ad esempio, quando l’oggetto deve essere aggiunto alla raccolta. Fare clic con il pulsante destro del mouse sul punto di interruzione e selezionare Condizioni.

  4. Utilizzare l’ID oggetto nel campo Espressione condizionale. Ad esempio, se la variabile item è l’oggetto da aggiungere alla raccolta, select è true e digita item = = item<n>, dove <n> è il numero ID dell’oggetto.

    L’esecuzione si interromperà nel punto in cui tale oggetto deve essere aggiunto alla raccolta.

    Per eliminare l’ID oggetto, fare clic con il pulsante destro del mouse sulla variabile nella finestra Locals e selezionare Elimina ID oggetto.

Nota

Gli ID oggetto creano riferimenti deboli e non impediscono la raccolta dei garbage dell’oggetto. Sono validi solo per la sessione di debug corrente.

Imposta una condizione di conteggio hit

Se sospetti che un ciclo nel tuo codice inizi a comportarsi male dopo un certo numero di iterazioni, puoi impostare un punto di interruzione per interrompere l’esecuzione dopo quel numero di hit, piuttosto che dover premere ripetutamente F5 per raggiungere quell’iterazione.

In Condizioni nella finestra Impostazioni punto di interruzione, selezionare Hit Count, quindi specificare il numero di iterazioni. Nell’esempio seguente, il punto di interruzione è impostato per colpire su ogni altra iterazione:

Breakpoint hit count

Impostare una condizione di filtro

È possibile limitare un punto di interruzione solo su dispositivi specificati o in processi e thread specificati.

In Condizioni nel punto di interruzione finestra delle Impostazioni, selezionare il Filtro, e quindi inserire una o più delle seguenti espressioni:

  • MachineName = “name”
  • Id = valore
  • ProcessName = “name”
  • ThreadId = valore
  • ThreadName = “nome”

Racchiudere i valori di stringa tra doppi apici. È possibile combinare le clausole utilizzando & (AND), || (OR), ! (NOT) e parentesi.

Imposta 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 sua posizione. È anche utile se si dispone di funzioni con lo stesso nome e si desidera interromperle tutte (come funzioni sovraccaricate o funzioni in progetti diversi).

Per impostare un punto di interruzione della funzione:

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

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

  2. Nella finestra di dialogo Nuovo punto di interruzione della funzione, immettere il nome della funzione nella casella Nome funzione.

    Per restringere la funzione specifica:

    • Utilizzare il nome completo della funzione.

      Esempio: Namespace1.ClassX.MethodA()

    • Aggiungere i tipi di parametri di una funzione sovraccaricata.

      Esempio: MethodA(int, string)

    • Usa il ‘!’simbolo per specificare il modulo.

      Esempio: App1.dll!MethodA

    • Utilizzare l’operatore di contesto in C++nativo.

      {function, , }

      Esempio: {MethodA, , App1.dll}+2

  3. Nel menu a discesa Lingua, scegliere la lingua della funzione.

  4. Selezionare OK.

Impostare un punto di interruzione della funzione utilizzando un indirizzo di memoria (solo C++ nativo)

È possibile utilizzare l’indirizzo di un oggetto per impostare un punto di interruzione della 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 sul metodo my_method chiamato dall’istanza.

  1. Imposta un punto di interruzione da qualche parte dopo che l’istanza della classe è stata istanziata.

  2. Trova l’indirizzo dell’istanza (ad esempio, 0xcccccccc).

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

  4. Aggiungere quanto segue alla casella Nome funzione e selezionare Linguaggio C++.

    ((my_class *) 0xcccccccc)->my_method

Imposta i punti di interruzione dei dati (. NET Core 3.0 o superiore)

I punti di interruzione dei dati interrompono l’esecuzione quando la proprietà di un oggetto specifico cambia.

Per impostare un punto di interruzione dei dati

  1. In un progetto. NET Core, avviare il debug e attendere fino al raggiungimento di un punto di interruzione.

  2. Nella finestra Autos, Watch o Locals, fare clic con il pulsante destro del mouse su una proprietà e selezionare Interrompi quando il valore cambia nel menu contestuale.

    Punto di interruzione dei dati gestiti

I punti di interruzione dei dati in. NET Core non funzioneranno per:

  • Proprietà che non sono espandibili nel tooltip, i Locali, le Automobili, o Guardare la finestra
  • variabili Statiche
  • Classi con il DebuggerTypeProxy Attributo
  • Campi all’interno di strutture

i dati del Set di punti di interruzione (C++ nativo solo)

Dati i punti di interruzione interruzione di esecuzione quando un valore memorizzato in un indirizzo di memoria specificata modifiche. Se il valore viene letto ma non modificato, l’esecuzione non si interrompe.

Per impostare un punto di interruzione dei dati:

  1. In un progetto C++, avviare il debug e attendere fino al raggiungimento di un punto di interruzione. Nel menu Debug, scegliere Nuovo punto di interruzione > Punto di interruzione dati.

    È anche possibile selezionare Nuovo > Punto di interruzione dati nella finestra Punti di interruzione o fare clic con il pulsante destro del mouse su un elemento nella finestra Autos, Watch o Locals e selezionare Interrompi quando il valore cambia nel menu contestuale.

  2. Nella casella Indirizzo, digitare un indirizzo di memoria o un’espressione che restituisce un indirizzo di memoria. Ad esempio, digitare &avar per interrompere quando il contenuto della variabile avar cambia.

  3. Nel menu a discesa Conteggio byte, selezionare il numero di byte che si desidera che il debugger guardi. Ad esempio, se si seleziona 4, il debugger guarderà i quattro byte a partire da &avar e si interromperà se uno di questi byte cambia valore.

I punti di interruzione dei dati non funzionano nelle seguenti condizioni:

  • Un processo che non è in fase di 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 si interromperà nell’aggiornamento.
  • Dove l’espressione orologio è maggiore di 4 byte su hardware a 32 bit e 8 byte su hardware a 64 bit. Questa è 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 automaticamente disabilitati alla fine di ogni sessione di debug.

  • Se si imposta un punto di interruzione dei dati su una variabile locale, il punto di interruzione rimane abilitato al termine della funzione, ma l’indirizzo di memoria non è più applicabile, pertanto il comportamento del punto di interruzione è imprevedibile. Se si imposta un punto di interruzione dei dati su una variabile locale, è necessario eliminare o disabilitare il punto di interruzione prima della fine della funzione.

Gestire i punti di interruzione nella finestra Punti di interruzione

È possibile utilizzare 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 in 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 i punti di interruzione. È inoltre possibile impostare condizioni e azioni o aggiungere una nuova funzione o un punto di interruzione dei dati.

Per aprire la finestra punti di Interruzione, selezionare Debug > Windows > punti di Interruzione, o premere Ctrl+Alt+B.

punti di Interruzione finestra

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 utilizzare 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, quindi selezionare Modifica etichette. Aggiungere una nuova etichetta o sceglierne una esistente, quindi selezionare OK.
  2. Ordina l’elenco dei punti di interruzione nella finestra Punti di interruzione selezionando le etichette, le condizioni o altre intestazioni di colonna. È possibile selezionare le colonne da visualizzare selezionando Mostra colonne nella barra degli strumenti.

Esporta e importa 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 una posizione di esportazione, 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 o immettere i criteri di ricerca nel campo di ricerca. Selezionare l’icona Esporta tutti i punti di interruzione corrispondenti ai criteri di ricerca correnti e salvare il file.
  • Per esportare tutti i punti di interruzione, deselezionare tutte le caselle e lasciare vuoto il campo di ricerca. Selezionare l’icona Esporta tutti i punti di interruzione corrispondenti ai criteri di ricerca correnti e salvare il file.
  • Per importare i punti di interruzione, nella finestra Punti di interruzione selezionare l’icona Importa punti di interruzione da un file, accedere al percorso del file XML e selezionare Apri.

Imposta i punti di interruzione dalle finestre del debugger

Puoi anche impostare i punti di interruzione dalle finestre dello stack delle chiamate e del debugger di disassemblaggio.

Impostare un punto di interruzione nella finestra dello stack di chiamate

Per interrompere l’istruzione o la riga a cui ritorna una funzione di chiamata, è possibile impostare un punto di interruzione nella finestra dello stack di chiamate.

Per impostare un punto di interruzione nella finestra dello stack di chiamate:

  1. Per aprire la finestra dello stack di chiamate, è necessario essere messi in pausa durante il debug. Selezionare Debug > Windows > Call Stack oppure premere Ctrl + Alt + C.

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

    Un simbolo breakpoint appare accanto al nome della chiamata di funzione nel margine sinistro dello stack di chiamate.

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

Il debugger si interrompe all’istruzione.

Per ulteriori informazioni sullo stack di chiamate, vedere Come: Utilizzare la finestra dello stack di chiamate.

Per tracciare visivamente i punti di interruzione durante l’esecuzione del codice, vedere Metodi Map nello stack di chiamate durante il debug.

Imposta un punto di interruzione nella finestra Disassemblaggio

  1. Per aprire la finestra di Disassemblaggio, è necessario essere messi in pausa durante il debug. Selezionare Debug > Windows > Disassemblaggio oppure premere Ctrl + Alt + D.

  2. Nella finestra Disassemblaggio, fare clic sul margine sinistro dell’istruzione in cui si desidera interrompere. Puoi anche selezionarlo e premere F9, oppure fare clic con il pulsante destro del mouse e selezionare Punto di interruzione > Inserisci punto di interruzione.

Vedi anche

  • Cos’è il debug?
  • Scrivi codice C# migliore usando Visual Studio
  • Prima guarda il debug
  • Risolvi i punti di interruzione nel debugger di Visual Studio

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.