Condividi tramite


Eseguire il 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 è costituito da almeno un thread. I processi con più thread vengono chiamati 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.

L'elaborazione parallela perfetta non è sempre possibile. I thread a volte devono essere sincronizzati. Un thread potrebbe dover attendere un risultato da un altro thread oppure un thread potrebbe richiedere l'accesso esclusivo a una risorsa usata da un altro thread. I problemi di sincronizzazione sono una causa comune di bug nelle applicazioni multithreading. A volte i thread possono finire in attesa di una risorsa che non diventa mai disponibile. Ciò comporta una condizione denominata deadlock.

Thread e processi

I thread e iprocessi sono concetti correlati nell'informatica. Entrambe rappresentano sequenze di istruzioni che devono essere eseguite in un ordine specifico. Le istruzioni in thread o processi separati, tuttavia, possono essere eseguite in parallelo.

I processi esistono nel sistema operativo e corrispondono a ciò che gli utenti vedono come programmi o applicazioni. Un thread, d'altra parte, esiste all'interno di un processo. Per questo motivo, i thread vengono talvolta definiti processi leggeri. Ogni processo è costituito da uno o più thread.

L'esistenza di più processi consente a un computer di eseguire più attività alla volta. L'esistenza di più thread consente a un processo di separare il lavoro da eseguire in parallelo. In un computer con multiprocessori, i processi o i thread possono essere eseguiti in processori diversi. In questo modo viene abilitata la vera elaborazione parallela.

Strumenti per il debug di app multithreading

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

  • Per il debug dei thread nella GPU, lo strumento principale è la finestra Thread GPU . Vedere Procedura: Usare la finestra Thread GPU.

  • Per i processi, gli strumenti principali sono la finestra di dialogo Connetti a processo , la finestra Processi e la barra degli strumenti Percorso debug .

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 con un'interfaccia utente può essere particolarmente difficile. È possibile considerare l'esecuzione dell'applicazione in un secondo computer e l'uso del debug remoto. Per altre informazioni, vedere Debug remoto.

La tabella seguente mostra le informazioni disponibili e le azioni che è possibile eseguire in ognuna di queste posizioni:

Interfaccia utente Informazioni disponibili Azioni che è possibile eseguire
Finestra di dialogo Connetti a processo Processi disponibili a cui è possibile connettersi:

- Nome processo (.exe)
- Numero ID processo
- Titolo barra dei menu
- Tipo (gestito v4.0; Gestito v2.0, v1.1, v1.0; x86; x64; IA64)
- Nome utente (nome account)
- Numero di sessione
Selezionare un processo a cui connettersi

Selezionare un computer remoto

Modificare il tipo di trasporto per la connessione ai computer remoti
Finestra Processi Processi collegati:

- Nome processo
- Numero ID processo
- Percorso di elaborazione .exe
- Titolo barra dei menu
- Stato (interruzione. In esecuzione)
- Debug (nativo, gestito e così via).
- Tipo di trasporto (impostazione predefinita, nativa senza autenticazione)
- Qualificatore trasporto (computer remoto)
Strumenti:

-Allegare
-Staccare
-Terminare

Menu di scelta rapida:

-Allegare
-Staccare
- Scollegarsi quando il debug è stato arrestato
-Terminare
Barra degli strumenti Percorso di debug - Processo corrente
- Sospendere l'applicazione
- Riprendere l'applicazione
- Sospendere e arrestare l'applicazione
- Thread corrente
- Attiva/disattiva lo stato del flag del thread corrente
- Mostra solo thread contrassegnati
- Mostra solo processo corrente
- Stack Frame corrente
- Passare a un altro processo
- Sospendere, riprendere o arrestare l'applicazione
- Passare a un altro thread nel processo corrente
- Passare a un altro stack frame nel thread corrente
- Contrassegna o annulla il flag dei thread correnti
- Mostra solo thread contrassegnati
- Mostra solo il processo corrente
Finestra Stack paralleli - Stack di chiamate per più thread in una finestra.
- Stack Frame attivo per ogni thread.
- Chiamanti e chiamate per qualsiasi metodo.
- Rilevamento deadlock
- Filtrare i thread specificati
- Filtrare gli stack di codice esterni
- Passare alla visualizzazione Attività
- Contrassegna o annulla il flag di un thread
-Zoom
- Copiare i frame dello stack
- Salvare/esportare tutti gli stack come immagine
Finestra Espressione di controllo parallelo - Colonna flag, in cui è possibile contrassegnare un thread a cui si vuole prestare particolare attenzione.
- Colonna cornice, in cui una freccia indica il fotogramma selezionato.
: colonna configurabile in grado di visualizzare il computer, il processo, il riquadro, l'attività e il thread.
- Contrassegna o annulla il flag di un thread
- Visualizza solo thread contrassegnati
- Cambia fotogrammi
- Ordinare una colonna
- Raggruppare i thread
- Bloccare o scongelare i thread
- esportare i dati nella finestra Espressione di controllo parallelo
Finestra Thread Thread nel processo corrente:

- ID thread
- ID gestito
- Categoria (thread principale, thread di interfaccia, gestore di chiamate di routine remota o thread di lavoro)
- Nome thread
- Percorso in cui viene creato il thread
-Priorità
- Maschera di affinità
- Conteggio sospeso
- Nome processo
- Indicatore flag
- Indicatore sospeso
Strumenti:

-Ricerca
- Stack di chiamate di ricerca
- Contrassegna just my code
- Contrassegna selezione modulo personalizzato
- Raggruppa per
-Colonne
- Espandere/Comprimere gli stack di chiamate
- Espandere/Comprimere i gruppi
- Blocca/Sblocca thread

Menu di scelta rapida:

- Mostra thread nell'origine
- Passare a un thread
- Bloccare un thread in esecuzione
- Scongelare un thread bloccato
- Contrassegna un thread per ulteriori studi
- Rimuovere il flag di un thread
- Rinominare un thread
- Mostrare e nascondere i thread

Altre azioni:

- Visualizzare lo stack di chiamate per un thread in una descrizione dati
Finestra di origine Gli indicatori di thread nella barra sinistra indicano singoli o più thread (disattivati per impostazione predefinita, attivati tramite il menu di scelta rapida nella finestra Thread ) Menu di scelta rapida:

- Passare a un thread
- Contrassegna un thread per ulteriori studi
- Rimuovere il flag di un thread
Finestra Attività - Visualizzare informazioni sugli Task oggetti, tra cui ID attività, stato attività (pianificato, in esecuzione, in attesa, deadlocked) e quale thread viene assegnato all'attività.
- Posizione corrente nello stack di chiamate.
- Delegato passato all'attività in fase di creazione
- Passare all'attività corrente
- Contrassegna o annulla il flag di un'attività
- Bloccare o scongelare un'attività
Finestra Thread GPU - Colonna flag, in cui è possibile contrassegnare un thread a cui si vuole 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 ogni gruppo di thread.
- Colonna Indirizzo , che visualizza l'indirizzo dell'istruzione in cui si trova ogni gruppo di thread.
- Colonna Location , ovvero la posizione nel codice dell'indirizzo.
- Colonna Stato , che indica se il thread è attivo o bloccato.
- Colonna Tile , che mostra l'indice del riquadro per i thread nella riga.
- Passare a un thread diverso
- Visualizzare un particolare riquadro e un thread
- Visualizzare o nascondere una colonna
- Ordinare in base a una colonna
- Raggruppare i thread
- Bloccare o scongelare i thread
- Contrassegna o annulla il flag di un thread
- Visualizza solo thread contrassegnati