Visualizzare thread e attività nella finestra Stack paralleli (C#, Visual Basic, C++)
La finestra Stack paralleli è utile per il debug di applicazioni multithreading. Include diverse visualizzazioni:
La visualizzazione Thread mostra le informazioni sullo stack di chiamate per tutti i thread nell'app. È possibile spostarsi tra thread e stack frame in tali thread.
La visualizzazione Attività mostra le informazioni sullo stack di chiamate centrate sulle attività.
- Nel codice gestito, la visualizzazione Attività mostra gli stack di chiamate degli System.Threading.Tasks.Task oggetti.
- Nel codice nativo, la visualizzazione Attività mostra gli stack di chiamate di gruppi di attività, algoritmi paralleli, agenti asincroni e attività leggere.
Method View pivots the call stack on a selected method.Method View pivots the call stack on a selected method.
Usare la finestra Stack in parallelo
Per aprire la finestra Stack paralleli , è necessario trovarsi in una sessione di debug. Selezionare Debug>stack paralleli di Windows.>
Controlli della barra degli strumenti
Nella finestra Stack paralleli sono disponibili i controlli della barra degli strumenti seguenti:
Icon | CTRL | Descrizione |
---|---|---|
/Casella combinata Attività thread | Consente di passare dalla visualizzazione degli stack di chiamate dei thread alla visualizzazione degli stack di chiamate delle attività e viceversa. Per altre informazioni, vedere Visualizzazione Attività e Visualizzazione Thread. | |
Mostra solo con contrassegno | Mostra gli stack di chiamate solo per i thread contrassegnati in altre finestre del debugger, ad esempio la finestra Thread GPU e la finestra Espressione di controllo parallelo. | |
Attiva/Disattiva visualizzazione metodo | Passa tra le visualizzazioni dello stack di chiamate e la visualizzazione metodo. Per altre informazioni, vedere Visualizzazione metodo. | |
Scorrimento automatico a stack frame corrente | Esegue automaticamente la registrazione del grafico in modo che il frame dello stack corrente sia visualizzato. Questa funzionalità è utile quando si modifica il frame dello stack corrente da altre finestre o quando si raggiunge un nuovo punto di interruzione in grafici di grandi dimensioni. | |
Attiva/Disattiva controllo zoom | Visualizza o nasconde il controllo zoom a sinistra della finestra. Indipendentemente dalla visibilità del controllo zoom, è anche possibile eseguire lo zoom premendo CTRL e girando la rotellina del mouse oppure premendo CTRL+MAIUSC++ per eseguire lo zoom avanti e CTRL+MAIUSC+- per eseguire lo zoom indietro. |
Icon | CTRL | Descrizione |
---|---|---|
/Casella combinata Attività thread | Consente di passare dalla visualizzazione degli stack di chiamate dei thread alla visualizzazione degli stack di chiamate delle attività e viceversa. Per altre informazioni, vedere Visualizzazione Attività e Visualizzazione Thread. | |
Controllo filtro | Mostra gli stack di chiamate solo per il set specifico di thread a cui si è interessati. | |
Mostra solo con contrassegno | Mostra gli stack di chiamate solo per i thread contrassegnati in altre finestre del debugger, ad esempio la finestra Thread GPU e la finestra Espressione di controllo parallelo. | |
Attiva/Disattiva visualizzazione metodo | Passa tra le visualizzazioni dello stack di chiamate e la visualizzazione metodo. Per altre informazioni, vedere Visualizzazione metodo. | |
Scorrimento automatico a stack frame corrente | Esegue automaticamente la registrazione del grafico in modo che il frame dello stack corrente sia visualizzato. Questa funzionalità è utile quando si modifica il frame dello stack corrente da altre finestre o quando si raggiunge un nuovo punto di interruzione in grafici di grandi dimensioni. | |
Attiva/Disattiva controllo zoom | Visualizza o nasconde il controllo zoom a sinistra della finestra. Indipendentemente dalla visibilità del controllo zoom, è anche possibile eseguire lo zoom premendo CTRL e girando la rotellina del mouse oppure premendo CTRL+MAIUSC++ per eseguire lo zoom avanti e CTRL+MAIUSC+- per eseguire lo zoom indietro. |
|
Controllo di ricerca | Con questa funzionalità è possibile eseguire facilmente ricerche tra stack frame e quindi usare le frecce per spostarsi tra questi risultati. | |
Salva controllo | Consente di salvare/esportare il contenuto dalla finestra dello stack parallelo come immagine. | |
Mostra controllo codice esterno | Usando questa funzionalità, è possibile mostrare/nascondere gli stack dal codice o dalle librerie esterne. |
Icone stack frame
Le icone seguenti forniscono informazioni sugli stack frame attivi e correnti in tutte le visualizzazioni:
Icon | Descrizione |
---|---|
Indica la posizione corrente (stack frame attivo) del thread corrente. | |
Indica la posizione corrente (stack frame attivo) di un thread non corrente. | |
Indica il frame dello stack corrente (contesto del debugger corrente). Il nome del metodo è in grassetto ovunque venga visualizzato. |
Icon | Descrizione |
---|---|
Indica la posizione corrente (stack frame attivo) del thread corrente. | |
Indica la posizione corrente (stack frame attivo) di un thread non corrente. | |
Indica il frame dello stack corrente (contesto del debugger corrente). Il nome del metodo è in grassetto ovunque venga visualizzato. | |
Indica che lo stack frame corrente ha un avviso di stato critico, ad esempio Deadlock. | |
Indica il nodo con deadlock. | |
Indica che il frame dello stack corrente contiene informazioni aggiuntive, ad esempio In attesa su, In attesa di blocco, di proprietà di e così via. | |
Indica che l'attività corrente è in stato di blocco/attesa e così via. | |
Indica che l'attività attualmente in esecuzione. |
Voci del menu di scelta rapida
Quando si fa clic con il pulsante destro del mouse su un metodo nella visualizzazione Thread o nella visualizzazione Attività , sono disponibili le voci di menu di scelta rapida seguenti. Gli ultimi sei elementi sono gli stessi della finestra Stack di chiamate.
Voce di menu | Descrizione |
---|---|
Flag | Contrassegna l'elemento selezionato. |
Rimuovi flag | Rimuove il flag dall'elemento selezionato. |
Blocca | Blocca l'elemento selezionato. |
Sblocca | Sblocca l'elemento selezionato. |
Passa al frame | Uguale al comando di menu corrispondente nella finestra Stack di chiamate. Nella finestra Stack paralleli, tuttavia, un metodo può essere in più fotogrammi . È possibile selezionare la cornice desiderata nel sottomenu per questo elemento. Se uno degli stack frame si trova nel thread corrente, tale frame viene selezionato per impostazione predefinita nel sottomenu. |
Passare a Attività o Vai al thread | Passa alla visualizzazione Attività o Thread e mantiene evidenziato lo stesso stack frame. |
Vai a codice sorgente | Passa alla posizione corrispondente nella finestra del codice sorgente. |
Vai a disassembly | Passa alla posizione corrispondente nella finestra Disassembly . |
Mostra codice esterno | Mostra o nasconde il codice esterno. |
Visualizzazione esadecimale | Consente di passare dalla visualizzazione decimale a quella esadecimale e viceversa. |
Mostra thread nell'origine | Contrassegna la posizione del thread nella finestra del codice sorgente. |
Informazioni sul caricamento simboli | Apre la finestra di dialogo Informazioni caricamento simboli. |
Impostazioni simboli | Apre la finestra di dialogo Simbolo Impostazioni. |
Voce di menu | Descrizione |
---|---|
Copia | Copiare l'elemento selezionato. |
Selezionare tutti i fotogrammi seguenti | Seleziona tutti i fotogrammi nello stack selezionato. |
Flag | Contrassegna l'elemento selezionato. |
Rimuovi flag | Rimuove il flag dall'elemento selezionato. |
Blocca | Blocca l'elemento selezionato. |
Sblocca | Sblocca l'elemento selezionato. |
Passa al frame | Uguale al comando di menu corrispondente nella finestra Stack di chiamate. Nella finestra Stack paralleli, tuttavia, un metodo può essere in più fotogrammi . È possibile selezionare la cornice desiderata nel sottomenu per questo elemento. Se uno degli stack frame si trova nel thread corrente, tale frame viene selezionato per impostazione predefinita nel sottomenu. |
Passare a Attività o Vai al thread | Passa alla visualizzazione Attività o Thread e mantiene evidenziato lo stesso stack frame. |
Vai a codice sorgente | Passa alla posizione corrispondente nella finestra del codice sorgente. |
Vai a disassembly | Passa alla posizione corrispondente nella finestra Disassembly . |
Mostra codice esterno | Mostra o nasconde il codice esterno. |
Visualizzazione esadecimale | Consente di passare dalla visualizzazione decimale a quella esadecimale e viceversa. |
Mostra thread nell'origine | Contrassegna la posizione del thread nella finestra del codice sorgente. |
Informazioni sul caricamento simboli | Apre la finestra di dialogo Informazioni caricamento simboli. |
Impostazioni simboli | Apre la finestra di dialogo Simbolo Impostazioni. |
visualizzazione thread
Nella visualizzazione Thread il frame dello stack e il percorso di chiamata del thread corrente sono evidenziati in blu. La posizione corrente del thread viene visualizzata dalla freccia gialla.
Per modificare lo stack frame corrente, fare doppio clic su un metodo diverso. Questo potrebbe anche cambiare il thread corrente, a seconda che il metodo selezionato faccia parte del thread corrente o di un altro thread.
Quando il grafico di visualizzazione Thread è troppo grande per adattarsi alla finestra, nella finestra viene visualizzato un controllo Visualizzazione occhio di uccello. È possibile spostare la cornice nel controllo per passare a diverse parti del grafico.
La figura seguente mostra un thread che passa da Main a una transizione da codice gestito a nativo. Sei thread si trovano nel metodo corrente. Uno continua a Thread.Sleep e un altro continua a Console.WriteLine e quindi a SyncTextWriter.WriteLine.
Nella tabella seguente vengono descritte le funzionalità principali della visualizzazione Thread :
Callout | Nome dell'elemento | Descrizione |
---|---|---|
1 | Segmento o nodo dello stack di chiamate | Contiene una serie di metodi per uno o più thread. Se al fotogramma non sono collegate linee di direzione, il fotogramma mostra l'intero percorso di chiamata per i thread. |
2 | Evidenziazione blu | Indica il percorso di chiamate del thread corrente. |
3 | Righe della freccia | Connettono i nodi per costituire l'intero percorso di chiamate per i thread. |
4 | Intestazione del nodo | Mostra il numero di processi e thread per il nodo. |
5 | metodo | Rappresenta uno o più stack frame nello stesso metodo. |
6 | Descrizione comando sul metodo | Viene visualizzato quando si passa il puntatore del mouse su un metodo. Nella visualizzazione Thread la descrizione comando mostra tutti i thread, in una tabella simile alla finestra Thread . |
La figura seguente mostra un thread che passa da Main a una transizione da codice gestito a nativo. Cinque thread si trovano nel metodo corrente. Uno continua a ServerClass.InstanceMethod e un altro continua a Worker.Thread.Start e quindi a StartupHook.Initialize.AnonymousMethod.
Nella tabella seguente vengono descritte le funzionalità principali della visualizzazione Thread :
Callout | Nome dell'elemento | Descrizione |
---|---|---|
1 | Segmento o nodo dello stack di chiamate | Contiene una serie di metodi per uno o più thread. Se al fotogramma non sono collegate linee di direzione, il fotogramma mostra l'intero percorso di chiamata per i thread. |
2 | Evidenziazione blu | Indica il percorso di chiamate del thread corrente. |
3 | Righe della freccia | Connettono i nodi per costituire l'intero percorso di chiamate per i thread. |
4 | Intestazione del nodo | Mostra il numero di processi/thread, nome del thread e ID del thread per il nodo. |
5 | metodo | Rappresenta uno o più stack frame nello stesso metodo. |
6 | Descrizione comando sul metodo | Viene visualizzato quando si passa il puntatore del mouse su un metodo. Nella visualizzazione Thread la descrizione comando mostra tutti i thread, in una tabella simile alla finestra Thread . |
Visualizzazione Attività
Se l'app usa System.Threading.Tasks.Task oggetti (codice gestito) o task_handle
oggetti (codice nativo) per esprimere il parallelismo, è possibile usare la visualizzazione Attività . La visualizzazione Attività mostra gli stack di chiamate delle attività anziché dei thread.
Nella visualizzazione Attività :
- Gli stack di chiamate di thread che non eseguono attività non vengono visualizzati.
- Gli stack di chiamate dei thread che eseguono attività vengono tagliati visivamente nella parte superiore e inferiore per mostrare i fotogrammi più rilevanti per le attività.
- Quando più attività si trovano in un solo thread, gli stack di chiamate di tali attività vengono visualizzati in nodi separati.
Per visualizzare un intero stack di chiamate, tornare alla visualizzazione Thread facendo clic con il pulsante destro del mouse su uno stack frame e selezionando Vai al thread.
La figura seguente mostra la visualizzazione Thread nella parte superiore e la visualizzazione Attività corrispondente nella parte inferiore.
Passare il puntatore del mouse su un metodo per visualizzare una descrizione comando con informazioni aggiuntive. Nella visualizzazione Attività la descrizione comando mostra tutte le attività in una tabella simile alla finestra Attività .
L'immagine seguente mostra la descrizione comando per un metodo nella visualizzazione Thread nella parte superiore e per la visualizzazione Attività corrispondente nella parte inferiore.
Visualizzazione metodo
Nella visualizzazione Thread o Nella visualizzazione Attività è possibile pivotare il grafico nel metodo corrente selezionando l'icona Attiva/Disattiva visualizzazione metodo sulla barra degli strumenti. La visualizzazione Metodo mostra immediatamente tutti i metodi in tutti i thread che chiamano o sono chiamati dal metodo corrente. La figura seguente mostra l'aspetto delle stesse informazioni nella visualizzazione Thread a sinistra e in Visualizzazione metodo a destra.
Se si passa a un nuovo stack frame, si imposta tale metodo sul metodo corrente e La visualizzazione metodo mostra tutti i chiamanti e i chiamato per il nuovo metodo. È possibile che, in conseguenza a ciò, alcuni thread compaiano o scompaiano dalla visualizzazione, a seconda che il metodo sia visualizzato nei relativi stack di chiamate. Per tornare alla visualizzazione stack di chiamate, selezionare di nuovo l'icona della barra degli strumenti Visualizzazione metodo.
Esercitazione video su thread e attività di debug con stack paralleli
Queste esercitazioni video illustrano come usare le visualizzazioni Thread e attività della finestra Stack paralleli in Visual Studio 2022 per eseguire il debug delle applicazioni multithreading.