Condividi tramite


Debug di thread e processi in Visual Studio

I termini thread e processi costituiscono concetti correlati in ambito informatico. Entrambi rappresentano infatti sequenze di istruzioni che devono essere eseguite in un ordine specifico. Le istruzioni incluse in thread o processi distinti possono tuttavia essere eseguite in parallelo.

I processi sono disponibili nel sistema operativo e corrispondono a ciò che gli utenti visualizzano sotto forma di programmi o applicazioni. I thread sono invece disponibili nei processi. Per questo motivo vengono talvolta definiti processi leggeri. Ciascun processo è costituito da uno o più thread.

La presenza di più processi consente a un computer di eseguire più attività contemporaneamente. La presenza di più thread consente invece a un processo di suddividere le operazioni da eseguire in parallelo. In un computer con più processori, i processi o i thread possono essere eseguiti in processori diversi consentendo l'effettiva elaborazione in parallelo.

Una perfetta elaborazione in parallelo non è sempre possibile. È talvolta necessario sincronizzare i thread. È inoltre possibile che un thread debba attendere un risultato di un altro thread o disporre di accesso esclusivo a una risorsa utilizzata da un altro thread. I problemi di sincronizzazione costituiscono una causa comune di bug in applicazioni con multithreading. È talvolta possibile che i thread rimangano in attesa di una risorsa che non diviene mai disponibile, causando una condizione denominata deadlock.

Nel debugger di Visual Studio sono disponibili strumenti efficaci e di facile utilizzo per il debug di thread e processi.

Strumenti per il debug di thread e processi in Visual Studio

I principali strumenti per la gestione dei processi in Visual Studio sono la finestra di dialogo Connetti a processo, la finestra Processi e la barra degli strumenti Posizione di debug. I principali strumenti per il debug dei thread sono la finestra Thread, i marcatori dei thread nelle finestre di origine e la barra degli strumenti Posizione di debug.

I principali strumenti per il debug delle applicazioni multithreading sono le finestre Stack in parallelo, Attività in parallelo, Espressione di controllo in parallelo e Thread GPU.

Nella tabella riportata di seguito sono illustrate le informazioni disponibili e le operazioni che è possibile eseguire con ciascuno strumento:

Interfaccia utente

Informazioni disponibili

Operazioni eseguibili

Finestra di dialogo Connetti a processo

Processi disponibili cui è possibile eseguire la connessione:

  • Nome di processo (estensione exe)

  • Numero di ID di processo

  • Titolo della barra dei menu

  • Tipo (Managed v4.0; Managed v2.0, v1.1, v1.0; x86; x64; IA64)

  • Nome utente (nome di account)

  • Numero di sessione

Selezione di un processo a cui connettersi

Selezione di un computer remoto

Modifica del tipo di trasporto per la connessione a computer remoti

Finestra Processi

Processi collegati:

  • Nome di processo

  • Numero di ID di processo

  • Percorso dell'eseguibile (file con estensione exe) di processo

  • Titolo della barra dei menu

  • Stato (Interrompi. In esecuzione)

  • Debug (nativo, gestito e così via)

  • Tipo di trasporto (predefinito, nativo senza autenticazione)

  • Qualificatore di trasporto (computer remoto)

Strumenti:

  • Connetti

  • Disconnetti

  • Termina

Menu di scelta rapida:

  • Connetti

  • Disconnetti

  • Disconnetti al termine del debug

  • Termina

Finestra Thread

Thread nel processo corrente:

  • ID thread

  • ID gestito

  • Categoria (thread principale, thread dell'interfaccia, gestore delle chiamate a una procedura remota o thread di lavoro)

  • Nome thread

  • Percorso in cui viene creato il thread

  • Priorità

  • Affinity Mask

  • Numero sospesi

  • Nome di processo

  • Indicatore flag

  • Indicatore di sospensione

Strumenti:

  • Cerca

  • Cerca nello stack di chiamate

  • Contrassegna Just My Code

  • Contrassegna selezione moduli personalizzata

  • Raggruppa per

  • Colonne

  • Espandi/Comprimi stack di chiamate

  • Espandi/comprimi gruppi

  • Blocca/sblocca thread

Menu di scelta rapida:

  • Mostra thread nell'origine

  • Passa al thread

  • Blocca un thread in esecuzione

  • Sblocca un thread bloccato

  • Imposta flag del thread per studio aggiuntivo

  • Rimuovi flag del thread

  • Rinomina thread

  • Mostra/Nascondi thread

Altre azioni:

  • Visualizzare lo stack di chiamate per un thread in un suggerimento dati

Finestra di origine

Gli indicatori dei thread all'estrema sinistra indicano thread singoli o più thread (disattivati per impostazione predefinita, si attivano tramite il menu di scelta rapida nella finestra Thread)

Menu di scelta rapida:

  • Passa al thread

  • Imposta flag del thread per studio aggiuntivo

  • Rimuovi flag del thread

Barra degli strumenti Posizione di debug

  • Processo corrente

  • Mostra l'anteprima dell'applicazione

  • Sospendi l'applicazione

  • Riprendi l'applicazione

  • Sospendi e arresta l'applicazione

  • Thread corrente

  • Attiva/Disattiva lo stato di flag del thread corrente

  • Mostrare solo thread con flag

  • Mostra solo processo corrente

  • Stack frame corrente

  • Passare a un altro processo

  • Sospendi, riprendi o arresta l'applicazione

  • Passare a un altro thread del processo corrente

  • Passare a un altro stack frame del thread corrente

  • Contrassegnare o rimuovere i contrassegni dei thread correnti

  • Mostrare solo thread con flag

  • Mostra solo processo corrente

Finestra Stack in parallelo

  • Stack di chiamate per più thread in una finestra.

  • Stack frame Attivo per ogni thread.

  • Chiamanti e chiamati per ogni metodo.

  • Filtraggio di thread specificati

  • Passaggio alla visualizzazione Attività in parallelo

  • Contrassegno o rimozione del contrassegno di un thread

  • Zoom

Finestra Attività in parallelo

  • Visualizzare informazioni sugli oggetti Task inclusi ID attività, stato dell'attività (programmato, in esecuzione, in attesa, in deadlock) e il thread assegnato all'attività.

  • Percorso corrente nello stack di chiamate.

  • Delegato passato all'attività in fase di creazione

  • Passare all'attività corrente

  • Contrassegnare o rimuovere il contrassegno di un'attività

  • Bloccare o sbloccare un'attività

Finestra Espressione di controllo in parallelo

  • Colonna flag, nella quale è possibile contrassegnare un thread al quale si desidera prestare particolare attenzione.

  • Colonna frame, in cui una freccia indica il frame selezionato.

  • Colonna configurabile che consente di visualizzare il computer, il processo, la sezione, l'attività e il thread.

  • Contrassegno o rimozione del contrassegno di un thread

  • Visualizza solo thread con flag

  • Passa da un frame all'altro

  • Ordina una colonna

  • Raggruppa i thread

  • Blocca o sblocca i thread

  • esporta i dati nella finestra Espressioni di controllo in parallelo

Finestra Thread GPU

  • Colonna flag, nella quale è possibile contrassegnare un thread al quale si desidera prestare particolare attenzione.

  • Colonna del thread attivo, nella quale una freccia gialla indica un thread attivo. Una freccia indica un thread nel quale l'esecuzione si è interrotta nel debugger.

  • Colonna Conteggio thread, che visualizza il numero di thread nella stessa posizione.

  • Colonna Riga che visualizza la riga di codice in cui si trova ciascun gruppo di thread.

  • Colonna Indirizzo che visualizza l'indirizzo dell'istruzione in cui si trova ciascun gruppo di thread.

  • Colonna Posizione che indica la posizione nel codice dell'indirizzo.

  • Colonna Stato, che indica se il thread è attivo o bloccato.

  • Colonna Sezione, che indica l'indice della sezione per i thread nella riga.

  • Passa a un altro thread attivo

  • Visualizza una sezione e un thread specifici

  • Mostra o nasconde una colonna

  • Ordina per colonna

  • Raggruppa i thread

  • Blocca o sblocca i thread

  • Contrassegno o rimozione del contrassegno di un thread

  • Visualizza solo thread con flag

Vedere anche

Altre risorse

Connessione a processi in esecuzione con il debugger di Visual Studio

Debug di applicazioni multithreading in Visual Studio

Debug del codice GPU