Condividi tramite


Procedura dettagliata: Eseguire il debug di un'app multithreading usando la finestra Thread (C#, Visual Basic, C++)

Diversi elementi dell'interfaccia utente di Visual Studio consentono di eseguire il debug di app multithreading. Questo articolo presenta le funzionalità di debug multithreading nella finestra dell'editor di codice, nella barra degli strumenti Percorso di debug e nella finestra Thread. Per informazioni su altri strumenti per il debug di app multithreading, vedere Introduzione al debug di app multithreading.

Il completamento di questa esercitazione richiede solo pochi minuti e acquisisce familiarità con le nozioni di base del debug delle app multithreading.

Creare un progetto di app multithreading

Creare il progetto di app multithreading seguente da usare in questa esercitazione:

  1. Aprire Visual Studio e creare un nuovo progetto.

    Se la finestra iniziale non è aperta, scegliere Finestra di avvio file>.

    Nella finestra iniziale scegliere Nuovo progetto.

    Nella finestra iniziale scegliere Crea un nuovo progetto.

    Nella finestra Crea un nuovo progetto immettere o digitare console nella casella di ricerca. Scegliere quindi C# o C++ dall'elenco Linguaggio e quindi scegliere Windows dall'elenco Piattaforma.

    Dopo aver applicato i filtri del linguaggio e della piattaforma, scegliere l'app console per .NET Core, .NET 5+o C++, quindi scegliere Avanti.

    Nota

    Se il modello corretto non è visualizzato, passare a Strumenti Ottieni strumenti>e funzionalità, che apre il Programma di installazione di Visual Studio. Scegliere il carico di lavoro Sviluppo per desktop .NET o Sviluppo di applicazioni desktop con C++, quindi scegliere Modifica.

    Nella finestra Configura il nuovo progetto digitare un nome o usare il nome predefinito nella casella Nome progetto. Scegliere quindi Avanti o Crea, a qualsiasi opzione disponibile.

    Per .NET Core o .NET 5+, scegliere il framework di destinazione consigliato o .NET 8 e quindi scegliere Crea.

    Verrà visualizzato un nuovo progetto console. Dopo aver creato il progetto, viene visualizzato un file di origine. A seconda della lingua scelta, il file di origine potrebbe essere chiamato Program.cs o MyThreadWalkthroughApp.cpp.

  2. Sostituire il codice nel file di origine con il codice di esempio C# o C++ di Get started debugging multithreading apps (Introduzione al debug di app multithreading).

  3. Selezionare File>Salva tutto.

Consente di iniziare il debug

  1. Trovare le righe seguenti nel codice sorgente:

    Thread.Sleep(3000);
    Console.WriteLine();
    
  2. Impostare un punto di interruzione sulla Console.WriteLine(); linea facendo clic sulla barra sinistra oppure selezionando la riga e premendo F9.

    Il punto di interruzione viene visualizzato come cerchio rosso nella barra sinistra accanto alla riga di codice.

  3. Selezionare Debug>Avvia debug oppure premere F5.

    L'app viene avviata in modalità di debug e viene sospesa in corrispondenza del punto di interruzione.

  4. In modalità di interruzione aprire la finestra Thread selezionando Debug>thread di Windows.> È necessario trovarsi in una sessione di debug per aprire o visualizzare i thread e altre finestre di debug.

Esaminare i marcatori di thread

  1. Nel codice sorgente individuare la Console.WriteLine(); riga.

    1. Fare clic con il pulsante destro del mouse nella finestra Thread e scegliere Mostra thread in Origine Mostra thread nell'origine dal menu.

    La barra accanto alla riga del codice sorgente ora visualizza un'icona dell'indicatore Marcatore di threaddi thread . Il marcatore del thread indica l'interruzione di un thread in questa posizione. Se nella posizione sono presenti più thread arrestati, viene visualizzata l'icona più thread .

  2. Posizionare il puntatore del mouse sul marcatore del thread. Viene visualizzato un suggerimento dati che mostra il nome e il numero ID del thread per il thread o i thread arrestati. I nomi dei thread possono essere <No Name>.

    Suggerimento

    Per identificare i thread senza nome, è possibile rinominarli nella finestra Thread . Fare clic con il pulsante destro del mouse sul thread e scegliere Rinomina.

  3. Fare clic con il pulsante destro del mouse sul marcatore del thread nel codice sorgente per visualizzare le opzioni disponibili nel menu di scelta rapida.

Impostare e rimuovere i flag dei thread

È possibile contrassegnare i thread per tenere traccia dei thread a cui si vuole prestare particolare attenzione.

Contrassegna e annulla il flag dei thread dall'editor del codice sorgente o dalla finestra Thread . Scegliere se visualizzare solo thread contrassegnati o tutti i thread dalle barre degli strumenti della finestra Percorso di debug o Thread . Le selezioni effettuate da qualsiasi posizione influiscono su tutte le posizioni.

Contrassegna e annulla il flag dei thread nel codice sorgente

  1. Aprire la barra degli strumenti Percorso di debug selezionando Visualizza>barre degli strumenti>Percorso di debug. È anche possibile fare clic con il pulsante destro del mouse nell'area della barra degli strumenti e selezionare Posizione di debug.

  2. La barra degli strumenti Percorso di debug include tre campi: Processo, Thread e Stack Frame. Nell'elenco a discesa Thread prendere nota del numero di thread presenti. Nell'elenco Thread il thread attualmente in esecuzione è contrassegnato da un > simbolo.

  3. Nella finestra del codice sorgente passare il puntatore del mouse sull'icona di un indicatore di thread nella barra e selezionare l'icona del flag (o una delle icone di flag vuote) nella descrizione dati. L'icona del flag diventa rossa.

    È anche possibile fare clic con il pulsante destro del mouse sull'icona di un indicatore di thread, scegliere Contrassegno e quindi selezionare un thread da contrassegnare dal menu di scelta rapida.

  4. Sulla barra degli strumenti Percorso di debug selezionare l'iconaMostra thread contrassegnati Mostra solo thread contrassegnati a destra del campo Thread. L'icona è disattivata a meno che uno o più thread non siano contrassegnati.

    Solo il thread contrassegnato viene ora visualizzato nell'elenco a discesa Thread sulla barra degli strumenti. Per visualizzare di nuovo tutti i thread, selezionare di nuovo l'icona Mostra solo thread contrassegnati .

    Suggerimento

    Dopo aver contrassegnato alcuni thread, è possibile posizionare il cursore nell'editor di codice, fare clic con il pulsante destro del mouse e selezionare Esegui thread contrassegnati su Cursore. Assicurarsi di scegliere il codice che tutti i thread contrassegnati raggiungeranno. Eseguire Thread contrassegnati su cursore sospende i thread nella riga di codice selezionata, semplificando il controllo dell'ordine di esecuzione bloccando e scongelando i thread.

  5. Per attivare o disattivare lo stato contrassegnato o non contrassegnato del thread attualmente in esecuzione, selezionare il singolo flag Toggle Current Thread Flagged State sulla barra degli strumenti, a sinistra del pulsante Mostra solo thread contrassegnati . Contrassegnare il thread corrente è utile per individuare il thread corrente quando vengono visualizzati solo i thread contrassegnati.

  6. Per rimuovere il flag di un thread, passare il puntatore del mouse sul marcatore del thread nel codice sorgente e selezionare l'icona del flag rosso per cancellarla oppure fare clic con il pulsante destro del mouse sul marcatore del thread e selezionare Annulla flag.

Contrassegna e annulla il flag dei thread nella finestra Thread

Nella finestra Thread, i thread contrassegnati hanno icone di flag rosso accanto a loro, mentre i thread non contrassegnati, se visualizzati, hanno icone di contorno vuote.

Finestra Thread

Selezionare un'icona di flag per modificare lo stato del thread in flagged o unflagged, a seconda dello stato corrente.

È anche possibile fare clic con il pulsante destro del mouse su una riga e scegliere Flag, Unflag o Unflag All Threads dal menu di scelta rapida.

La barra degli strumenti della finestra Thread dispone anche di un pulsante Mostra solo thread contrassegnati, che è la mano destra una delle due icone del flag. Funziona come il pulsante sulla barra degli strumenti Posizione di debug e uno dei due pulsanti controlla la visualizzazione in entrambe le posizioni.

Altre funzionalità della finestra Thread

Nella finestra Thread selezionare l'intestazione di qualsiasi colonna per ordinare i thread in base a tale colonna. Selezionare di nuovo per invertire l'ordinamento. Se vengono visualizzati tutti i thread, la selezione della colonna icona flag ordina i thread in base allo stato contrassegnato o non contrassegnato.

La seconda colonna della finestra Thread (senza intestazione) è la colonna Thread corrente. Una freccia gialla in questa colonna contrassegna il punto di esecuzione corrente.

La colonna Percorso mostra dove viene visualizzato ogni thread nel codice sorgente. Selezionare la freccia di espansione accanto alla voce Posizione oppure passare il puntatore del mouse sulla voce per visualizzare uno stack di chiamate parziale per tale thread.

Suggerimento

Per una visualizzazione grafica degli stack di chiamate per i thread, usare la finestra Stack paralleli . Per aprire la finestra, durante il debug, selezionare Debug>di stack paralleli di Windows.>

Oltre a Flag, Unflag e Unflag All Threads, il menu di scelta rapida per gli elementi della finestra Thread include:

  • Pulsante Mostra thread nell'origine .
  • Visualizzazione esadecimale, che modifica l'ID thread s nella finestra Thread dal formato decimale a quello esadecimale.
  • Passare al thread, che passa immediatamente all'esecuzione a tale thread.
  • Rinominare, che consente di modificare il nome del thread.
  • Bloccare e sbloccare i comandi.

Bloccare e sbloccare l'esecuzione del thread

È possibile bloccare e sbloccare, sospendere e riprendere, thread per controllare l'ordine in cui i thread eseguono il lavoro. Il blocco e il disgelo dei thread consentono di risolvere i problemi di concorrenza, ad esempio deadlock e race condition.

Suggerimento

Per seguire un singolo thread senza bloccare altri thread, che è anche uno scenario di debug comune, vedere Introduzione al debug di applicazioni multithreading.

Per bloccare e sbloccare i thread:

  1. Nella finestra Thread fare clic con il pulsante destro del mouse su qualsiasi thread e quindi scegliere Blocca. Un'icona Pausa nella colonna Thread corrente indica che il thread è bloccato.

  2. Selezionare Colonne nella barra degli strumenti della finestra Thread e quindi selezionare Conteggio sospeso per visualizzare la colonna Conteggio sospeso. Il valore del conteggio sospeso per il thread bloccato è 1.

  3. Fare clic con il pulsante destro del mouse sul thread bloccato e scegliere Thaw.

    L'icona Sospendi scompare e il valore Di conteggio sospeso diventa 0.

Passare a un altro thread

È possibile che venga visualizzata una finestra In modalità di interruzione quando si tenta di passare a un altro thread. Questa finestra indica che il thread non dispone di codice che il debugger corrente può visualizzare. Ad esempio, è possibile eseguire il debug di codice gestito, ma il thread è codice nativo. La finestra offre suggerimenti per la risoluzione del problema.

Per passare a un altro thread:

  1. Nella finestra Thread prendere nota dell'ID thread corrente, ovvero il thread con una freccia gialla nella colonna Thread corrente. Si vuole tornare a questo thread per continuare l'app.

  2. Fare clic con il pulsante destro del mouse su un thread diverso e scegliere Passa al thread dal menu di scelta rapida.

  3. Osservare che la posizione della freccia gialla è stata modificata nella finestra Thread . L'indicatore di thread corrente originale rimane anche come contorno.

    Esaminare la descrizione comando sull'indicatore di thread nell'editor dell'origine del codice e l'elenco nell'elenco a discesa Thread sulla barra degli strumenti Percorso di debug. Osservare che anche il thread corrente è stato modificato.

  4. Sulla barra degli strumenti Percorso di debug selezionare un thread diverso dall'elenco Thread. Si noti che anche il thread corrente cambia nelle altre due posizioni.

  5. Nell'editor del codice sorgente fare clic con il pulsante destro del mouse su un marcatore di thread, scegliere Passa al thread e selezionare un altro thread dall'elenco. Osservare che il thread corrente cambia in tutte e tre le posizioni.

Con l'indicatore di thread nel codice sorgente, è possibile passare solo ai thread arrestati in tale posizione. Con la finestra Thread e la barra degli strumenti Posizione di debug è possibile passare a tutti i tipi di thread.

Sono state apprese le nozioni di base per il debug di app multithreading. È possibile osservare, contrassegnare e rimuovere i flag e bloccare e sbloccare i thread usando la finestra Thread , l'elenco Thread nella barra degli strumenti Percorso di debug o gli indicatori di thread nell'editor del codice sorgente.