Condividi tramite


Visualizzare i thread nel debugger di Visual Studio (C#, Visual Basic, C++)

La finestra thread nel debugger di Visual Studio consente di esaminare e usare thread nell'applicazione di cui si sta eseguendo il debug. La finestra offre funzionalità per raggruppare, ordinare, contrassegnare, bloccare, sbloccare, cercare i thread nel codice e visualizzare gli stack delle chiamate.

La finestra Threads è disponibile solo mentre è in esecuzione il debugger di Visual Studio. Durante una sessione di debug, è possibile aprire la finestra selezionando Debug>Windows>Threads.

Questo articolo descrive come usare la finestra thread per i programmi C#, Visual Basic o C++. Per una guida passo passo su come usare la finestra dei thread, vedere Procedura dettagliata: Eseguire il debugging usando la finestra dei thread.

Esplorare la tabella della finestra Thread

La finestra Threads presenta una tabella in cui ogni riga corrisponde a un thread separato nella tua applicazione. Nella visualizzazione predefinita la tabella mostra tutti i thread nell'applicazione. È possibile configurare le impostazioni della tabella in modo da visualizzare solo i thread che interessano l'utente. La tabella fornisce più colonne per descrivere in dettaglio i thread. È possibile modificare il posizionamento delle colonne e nascondere le colonne non necessarie.

Nella tabella seguente vengono descritte tutte le colonne disponibili per la finestra tabella Thread e si indica se la colonna è visibile o nascosta nella visualizzazione predefinita. Le colonne vengono elencate in base alla posizione predefinita della tabella da sinistra a destra.

Colonna Predefinito Descrizione
Bandiera Visibile, senza etichetta Le bandiere rosse in questa colonna indicano thread contrassegnati per un'attenzione speciale. Selezionare l'icona della bandiera (il colore dell'icona cambia in rosso) per contrassegnare o togliere il contrassegno (l'icona diventa il contorno della bandiera) di un thread. L'icona del flag colorato consente di distinguere un thread contrassegnato da altri thread nella tabella. Per altre informazioni, vedere Flag e unflag thread.
thread corrente Visibile, senza etichetta L'icona a forma di freccia gialla in questa colonna indica il thread corrente nell'applicazione in esecuzione nel debugger. Un'icona contorno freccia in questa colonna indica il contesto del debugger corrente per un thread non corrente.
ID Visibile Fornisce il numero di identificazione per ogni thread.
ID gestito Visibile Visualizza i numeri di identificazione gestiti per i thread gestiti.
categoria Visibile Indica la categoria di thread come thread dell'interfaccia utente, gestori di chiamate di routine remota o thread di lavoro. Una categoria speciale identifica il thread principale dell'applicazione.
Nome Visibile Identifica ogni thread in base al nome o <Nessun nome> se il thread non ha alcun nome specificato. Quando un thread non esiste più, il thread ha l'etichetta [Thread Destroyed].
Posizione Visibile Mostra dove il thread è in esecuzione all'interno dello stack di chiamate dell'applicazione. Selezionare la freccia a discesa per visualizzare lo stack di chiamate completo per il thread. Quando un thread non è più disponibile, la posizione viene etichettata come <non disponibile>.
priorità Nascosto Visualizza la priorità o la precedenza assegnata dal sistema a ogni thread.
maschera di affinità Nascosto Mostra la maschera di affinità del processore per ogni thread. In un sistema multiprocessore, la maschera di affinità determina i processori in cui un thread può essere eseguito.
conteggio sospeso Nascosto Fornisce il conteggio sospeso. Questo conteggio determina se un thread può essere eseguito. Per ulteriori informazioni, consultare Congelare e scongelare i thread.
nome processo Nascosto Visualizza il processo a cui appartiene ogni thread. I dati in questa colonna possono essere utili quando si esegue il debug di molti processi.
ID del processo Nascosto Mostra l'ID del processo a cui appartiene ogni thread.
Qualificatore di Trasporto Nascosto Identifica in modo univoco il computer a cui è connesso il debugger.

Visualizzare e nascondere le colonne della tabella

Nella barra degli strumenti della finestra Thread, il menu a discesa Colonne mostra l'elenco delle colonne disponibili. Espandi l'elenco a discesa e seleziona un nome di colonna per attivare o disattivare la visibilità nella tabella. Le colonne visibili sono indicate con un segno di spunta nell'elenco.

Segna i thread per ricevere particolare attenzione

Usare l'icona a forma di bandiera per attirare l'attenzione sui thread. I thread contrassegnati sono indicati da un'icona di bandiera rossa nella tabella della finestra Threads. Per altre informazioni, vedere Flag e Unflag thread.

Mostra solo thread contrassegnati

È possibile filtrare la finestra thread per visualizzare solo i thread contrassegnati. Nella barra degli strumenti della finestra Threads, selezionare Mostra solo thread segnalati (icona a doppia bandierina). È anche possibile usare i tasti di scelta rapida CTRL + 9. Questa azione è disponibile solo quando sono presenti thread contrassegnati.

Sospendere e scongelare i thread

Quando si blocca un thread, il sistema non avvia l'esecuzione del thread, anche se le risorse sono disponibili.

Nel codice nativo è possibile sospendere o riprendere i thread chiamando le funzioni di Windows SuspendThread e ResumeThread. È anche possibile chiamare le funzioni MFC CWinThread::SuspendThread e CWinThread::ResumeThread. Se si chiama la funzione SuspendThread o ResumeThread, il conteggio sospeso visualizzato nella finestra thread cambia. Il conteggio sospeso non cambia se si blocca o si scongela un thread nativo. Un thread non può essere eseguito nel codice nativo a meno che il thread non venga scongelato e abbia un conteggio sospeso pari a zero.

Nel codice gestito, il conteggio sospeso cambia quando si blocca o si scongela un thread. Se si blocca un thread nel codice gestito, il conteggio sospeso è 1. Quando si blocca un thread nel codice nativo, il conteggio delle sospensioni è 0, a meno che non si utilizzi la chiamata SuspendThread.

Nota

Quando si esegue il debug di una chiamata dal codice nativo al codice gestito, il codice gestito viene eseguito nello stesso thread fisico del codice nativo chiamante. La sospensione o il blocco del thread nativo blocca anche il codice gestito.

Modificare l'esecuzione per i thread selezionati

È possibile bloccare o sbloccare l'esecuzione di uno o più thread. Nella finestra dei thread , selezionare i thread per cui si vuole aggiornare lo stato di esecuzione. Nella barra degli strumenti della finestra thread, selezionare Blocca thread (icona di riproduzione in pausa) o Sblocca thread (icona di riproduzione verde). L'azione si applica solo ai thread attualmente selezionati. Le azioni di congelamento e disgelo sono disponibili anche nel menu di scelta rapida del clic con il pulsante destro del mouse per ogni thread.

Modificare il thread corrente

Un'icona a forma di freccia gialla nella tabella della finestra Threads indica il thread corrente (e la posizione del puntatore di esecuzione). Il marcatore originale del thread corrente è anch'esso ancora presente (visualizzato con un'icona a forma di sagoma di freccia).

Un'icona a forma di freccia gialla nella tabella della finestra Threads indica il thread corrente (e la posizione del puntatore di esecuzione). Un'icona a forma di freccia verde con una coda curva indica che un thread non attivo ha il contesto corrente del debugger.

Passare a un altro thread

Esistono due modi per cambiare il thread corrente nel debugger. Fare doppio clic su qualsiasi discussione nella tabella della finestra Thread per renderla la discussione corrente. È anche possibile fare clic con il pulsante destro del mouse su un thread e selezionare Passa al thread.

Applicare il raggruppamento e l'ordinamento ai thread

È possibile raggruppare i thread nella tabella thread finestra usando gli stessi criteri delle colonne disponibili. Tutti i criteri sono sempre disponibili per il raggruppamento, indipendentemente dal fatto che la colonna corrispondente sia visibile nella visualizzazione corrente. È possibile selezionare un solo raggruppamento per la tabella.

Quando si raggruppano i thread, viene visualizzata un'intestazione nella tabella per ogni gruppo. L'intestazione include una descrizione del gruppo insieme al numero di membri nel gruppo. Se si raggruppa per Nome , è possibile che vengano visualizzati raggruppamenti con intestazioni come Thread Lavoratore o Thread Non Contrassegnati . Accanto a ogni intestazione di gruppo viene visualizzata un'icona a forma di freccia di espansione/compressione.

Dopo aver applicato un criterio di raggruppamento, la visualizzazione della tabella nella finestra Threads viene aggiornata per mostrare i thread membri per ogni gruppo sotto la loro intestazione. Utilizzare l'icona a forma di freccia di espansione/compressione per un gruppo per visualizzare o nascondere i membri nella visualizzazione corrente.

È anche possibile applicare un singolo criterio di ordinamento ai thread nella tabella Thread finestra. Il raggruppamento ha la precedenza sull'ordinamento. Ad esempio, è possibile raggruppare i thread in base Categoria e quindi ordinarli in base ID all'interno di ogni Categoria.

Raggruppare i thread nella tabella

Nella barra degli strumenti della finestra Thread, espandere l'elenco a discesa Raggruppa per e selezionare i criteri per raggruppare i thread. È anche possibile rimuovere il raggruppamento applicato selezionando nessuno nell'elenco a discesa Raggruppa per.

Ordinare i thread nella tabella

Si applica l'ordinamento ai thread nella tabella della finestra Threads selezionando le intestazioni di colonna nella parte superiore della tabella, come Nome o ID.

Quando si seleziona un'intestazione di colonna, la vista nella finestra della tabella dei thread viene aggiornata per mostrare i thread ordinati in base ai valori nella colonna selezionata. La colonna selezionata mostra anche un'icona freccia su/giù. L'icona freccia su indica l'ordinamento in base alla colonna selezionata in ordine crescente. L'icona freccia giù indica l'ordinamento in base alla colonna selezionata in ordine decrescente. Selezionare l'intestazione di colonna per modificare l'ordinamento.

Ordinare i thread all'interno dei gruppi

Per ordinare i thread all'interno di gruppi nella finestra Thread, usate innanzitutto l'elenco a discesa Raggruppa per per applicare i criteri di raggruppamento. Selezionare quindi l'intestazione di colonna per ordinare i thread raggruppati in base ai valori nella colonna selezionata.

Espandere o comprimere tutti i gruppi

È possibile visualizzare o nascondere tutti i raggruppamenti nella visualizzazione corrente in modo rapido. Nella barra degli strumenti della finestra Thread, selezionare Espandi i gruppi (icona a forma di doppia casella con segno più) o Comprimi i gruppi (icona a forma di doppia casella con simbolo meno).

Cerca discussioni

È possibile cercare i thread nella tabella finestra di thread e cercare contenuto specifico in una delle colonne di tabella visibili. Quando si esegue la ricerca, Visual Studio visualizza le righe del thread con dati di colonna corrispondenti alla stringa di ricerca. La ricerca analizza anche il percorso del thread visualizzato nella parte superiore della pila delle chiamate nella colonna denominata Location.

Cercare contenuto specifico nei thread

Esistono diversi modi per cercare contenuti specifici nei thread. Nella barra degli strumenti della finestra thread immettere la stringa da cercare nella casella di ricerca e selezionare Immettere. È possibile specificare lettere, numeri e caratteri speciali come < nella stringa di ricerca. Al termine della ricerca, la finestra thread aggiorna la tabella per visualizzare i thread con risultati corrispondenti. Visual Studio evidenzia le istanze specifiche che corrispondono alla stringa di ricerca. Per tornare alla visualizzazione thread normale, selezionare l'icona X accanto alla casella cerca.

È anche possibile cercare una stringa cercata in precedenza. Usare la casella a discesa Ricerca e selezionare una stringa di ricerca precedente.

Cerca lo stack di chiamate completo

Per impostazione predefinita, lo stack di chiamate completo non viene cercato. Visual Studio cerca una corrispondenza solo nei thread visibili nella tabella della finestra thread.

È possibile includere lo stack di chiamate completo selezionando Includi stack di chiamate nella ricerca (icona dell'elemento elenco) nella barra degli strumenti della finestra dei thread . Quando l'opzione è abilitata, l'icona dell'elemento di elenco ha un bordo.

Visualizzare gli stack di chiamate e passare da un frame all'altro

In un programma multithreading ogni thread ha un proprio stack di chiamate. La finestra Threads offre un modo pratico per visualizzare questi stack.

Suggerimento

Per una rappresentazione visiva dello stack di chiamate per ogni thread, usare la finestra Stack Paralleli.

Visualizzare lo stack di chiamate per il thread

Nella tabella finestra thread individuare il thread per cui si vuole esaminare lo stack di chiamate completo. Nella colonna percorso selezionare la freccia di espansione/compressione a sinistra del percorso del thread. La localizzazione si estende per visualizzare lo stack di chiamate completo per il thread. Selezionare di nuovo la freccia per visualizzare solo la posizione.

Visualizzare o comprimere tutti gli stack di chiamate

È possibile controllare se la finestra dei thread mostra sempre gli stack di chiamate completi per tutti i thread nella tabella. Nella barra degli strumenti della finestra Threads, selezionare Espandi stack di chiamate (icona casella con segno più) o Comprimi stack di chiamate (icona casella con segno meno).