Condividi tramite


Debug di applicazioni multithreading in Visual Studio

Un thread è una sequenza di istruzioni a cui il sistema operativo concede tempo processore. Ogni processo in esecuzione nel sistema operativo è composto da almeno un thread. I processi composti da più di un thread sono detti multithreading.

I computer con più processori, processori multicore o processi di hyperthreading possono eseguire più thread simultanei. L'elaborazione parallela che usa molti thread può migliorare notevolmente le prestazioni del programma, ma può anche rendere più difficile il debug perché si stanno monitorando molti thread.

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.

Thread e processi

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.

Strumenti per il debug di app multithreading

Visual Studio offre diversi strumenti da usare per il debug di app multithreading.

Visual Studio offre anche punti di interruzione e punti di analisi avanzati, che possono essere utili quando si esegue il debug di applicazioni multithreading. Usare condizioni e filtri dei punti di interruzione per inserire punti di interruzione in singoli thread. I punti di traccia consentono di tracciare l'esecuzione del programma senza interruzioni, per studiare problemi come deadlock. Per altre informazioni, vedere Azioni punto di interruzione e punti di traccia.

Il debug di un'applicazione multithreading dotata di un'interfaccia utente può essere particolarmente complesso. È possibile considerare l'esecuzione dell'applicazione in un secondo computer e l'uso del debug remoto. Per altre informazioni, vedere Debug remoto.

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 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 processo
- Numero di ID di processo
- Percorso dell'eseguibile (file con estensione exe) di processo
- Titolo della barra dei menu
- Stato (interruzione. In esecuzione)
- Debug (nativo, gestito e così via)
- Tipo di trasporto (predefinito, nativo senza autenticazione)
- Qualificatore di trasporto (computer remoto)
Strumenti:

- Attach
- Detach
- Terminate

Menu di scelta rapida:

- Attach
- Detach
- Disconnetti al termine del debug
- Terminate
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à
- Maschera di affinità
- Numero sospesi
- Nome 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
- Sospendi l'applicazione
- Riprendi l'applicazione
- Sospendi e arresta l'applicazione
- Thread corrente
- Attiva/Disattiva lo stato di flag del thread corrente
- Mostra solo thread con flag
- Mostra solo processo corrente
- Stack frame corrente
- Passa a un altro processo
- Sospendi, riprendi o arresta l'applicazione
- Passa a un altro thread del processo corrente
- Passa a un altro stack frame del thread corrente
- Contrassegna o rimuovi i contrassegni dei thread correnti
- Mostra 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.
- Rilevamento deadlock
- Filtrare i thread specificati
- Filtrare gli stack di codice esterni
- Passare alla visualizzazione Attività
- Contrassegno o rimozione del contrassegno di un thread
-Zoom
- Copiare i frame dello stack
- Salvare/esportare tutti gli stack come immagine
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 Attività - 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 Thread GPU - Colonna flag, nella quale è possibile contrassegnare un thread al quale si desidera prestare particolare attenzione.
- Colonna thread corrente, in cui una freccia gialla indica il thread corrente.
- 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.
- Passare a un thread diverso
- 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