Anzeigen von Threads und Aufgaben im Fenster „Parallele Stapel“ (C#, Visual Basic, C++)
Das Fenster "Parallel Stacks" ist für die Fehlerbehebung von Multithread-Anwendungen nützlich. Das Fenster enthält mehrere Ansichten:
In der Threadansicht werden Informationen zur Aufrufliste für alle Threads in der App angezeigt. Sie können zwischen Threads und Stapelrahmen in diesen Threads navigieren.
In der Taskansicht werden taskorientierte Aufruflisteninformationen angezeigt.
- In verwaltetem Code werden in der Aufgabenansicht Aufruflisten von System.Threading.Tasks.Task-Objekten angezeigt.
- In nativem Code werden in der Aufgabenansicht Aufruflisten von Aufgabengruppen, parallelen Algorithmen, asynchronen Agents und einfachen Aufgaben angezeigt.
In der Methodenansicht wird die Aufrufliste einer ausgewählten Methode pivotiert.
Verwenden des Fensters „Parallele Stapel“
Zum Öffnen des Fensters "Parallel Stacks" müssen Sie sich in einer Debugsitzung befinden. Wählen Sie Debuggen>Fenster>Parallele Stapel aus.
Symbolleisten-Steuerelemente
Das Fenster Parallele Stapel enthält die folgenden Symbolleisten-Steuerelemente:
Symbol | Steuerelement | Beschreibung |
---|---|---|
kombinationsfeld ![]() |
Kombinationsfeld Threads/Aufgaben | Schaltet die Ansicht zwischen Aufruflisten von Threads und Aufruflisten von Aufgaben um. Weitere Informationen finden Sie in Aufgabenansicht und Threadsansicht. |
![]() |
Nur gekennzeichnete Elemente anzeigen | Mit dieser Option werden nur Aufruflisten für die Threads angezeigt, die in anderen Debuggerfenstern wie den Fenstern GPU-Threads und Parallele Überwachung gekennzeichnet wurden. |
![]() |
Methodenansicht umschalten | Mit dieser Option können Sie zwischen der Aufruflistenansicht und der Methodenansicht wechseln. Weitere Informationen finden Sie unter Methodenansicht. |
![]() |
Automatisches Scrollen zu aktuellem Stapelrahmen durchführen | Mit dieser Option können Sie im Graph automatisch zum aktuellen Stapelrahmen scrollen. Dieses Feature ist nützlich, wenn Sie den aktuellen Stack-Frame aus anderen Fenstern ändern oder wenn Sie einen neuen Haltepunkt in großen Graphen erreichen. |
![]() |
Zoomsteuerung umschalten | Mit dieser Option wird das Zoomsteuerelement auf der linken Seite des Fensters ein- und ausgeblendet. Unabhängig von der Sichtbarkeit des Zoomsteuerelements können Sie auch zoomen, indem Sie STRG- drücken und das Mausrad drehen, oder indem Sie STRG-+UMSCHALT-++ zum Vergrößern und STRG-+UMSCHALT-+- zum Verkleinern drücken. |
Symbol | Steuerelement | Beschreibung |
---|---|---|
kombinationsfeld ![]() |
Kombinationsfeld Threads/Aufgaben | Schaltet die Ansicht zwischen Aufruflisten von Threads und Aufruflisten von Aufgaben um. Weitere Informationen finden Sie in Aufgabenansicht und Threadsansicht. |
![]() |
Filter-Steuerelement | Mit dieser Option zeigen Sie die Aufruflisten nur für die gewünschte Gruppe von Threads an. |
![]() |
Nur gekennzeichnete Elemente anzeigen | Mit dieser Option werden nur Aufruflisten für die Threads angezeigt, die in anderen Debuggerfenstern wie den Fenstern GPU-Threads und Parallele Überwachung gekennzeichnet wurden. |
![]() |
Methodenansicht umschalten | Mit dieser Option können Sie zwischen der Aufruflistenansicht und der Methodenansicht wechseln. Weitere Informationen finden Sie unter Methodenansicht. |
![]() |
Automatisches Scrollen zu aktuellem Stapelrahmen durchführen | Mit dieser Option können Sie im Graph automatisch zum aktuellen Stapelrahmen scrollen. Dieses Feature ist nützlich, wenn Sie den aktuellen Stack-Frame aus anderen Fenstern ändern oder wenn Sie einen neuen Haltepunkt in großen Graphen erreichen. |
![]() |
Zoomsteuerung umschalten | Mit dieser Option wird das Zoomsteuerelement auf der linken Seite des Fensters ein- und ausgeblendet. Unabhängig von der Sichtbarkeit des Zoomsteuerelements können Sie auch zoomen, indem Sie STRG- drücken und das Mausrad drehen, oder indem Sie STRG-+UMSCHALT-++ zum Vergrößern und STRG-+UMSCHALT-+- zum Verkleinern drücken. |
![]() |
Suchsteuerung | Mit dieser Funktion können Sie einfach Stapelrahmen durchsuchen und dann Pfeile verwenden, um zwischen diesen Ergebnissen zu navigieren. |
![]() |
Steuerelement „Speichern“ | Diese Option ermöglicht das Speichern/Exportieren des Inhalts aus dem Fenster mit parallelen Stapeln als Bild. |
![]() |
Externe Codekontrolle anzeigen | Mit diesem Feature können Sie die Stapel im externen Code und in externen Bibliotheken ein- und ausblenden. |
![]() |
Zusammenfassen von Aufruflisten | Ab Visual Studio 2022, Version 17.13 Preview 4, können Sie Zusammenfassen auswählen, wenn Copilot installiert und aktiviert ist. Mit dieser Schaltfläche wird das Copilot-Chatfenster geöffnet, das bereits mit dem relevanten Threadkontext geladen wurde, sodass Sie Details untersuchen können, einschließlich Threadzuständen, Funktionsaufrufen und vorgeschlagenen Fixes. |
Stack-Frame-Symbole
Die folgenden Symbole bieten Informationen zu den aktiven und aktuellen Stapelrahmen in allen Ansichten:
Symbol | Beschreibung |
---|---|
![]() |
Dieses Symbol gibt die aktuelle Position (aktiver Stapelrahmen) des aktuellen Threads an. |
Symbol ![]() |
Dieses Symbol gibt die aktuelle Position (aktiver Stapelrahmen) von nicht aktuellen Threads an. |
![]() |
Gibt den aktuellen Stapelrahmen (den aktuellen Debuggerkontext) an. Der Methodenname wird immer fett formatiert. |
Symbol | Beschreibung |
---|---|
![]() |
Dieses Symbol gibt die aktuelle Position (aktiver Stapelrahmen) des aktuellen Threads an. |
Symbol ![]() |
Dieses Symbol gibt die aktuelle Position (aktiver Stapelrahmen) von nicht aktuellen Threads an. |
![]() |
Gibt den aktuellen Stapelrahmen (den aktuellen Debuggerkontext) an. Der Methodenname wird immer fett formatiert. |
![]() |
Gibt an, dass der aktuelle Stapelrahmen eine Warnung zu einem kritischen Status wie aufweist, etwa einem Deadlock |
![]() |
Gibt den blockierten Knoten an. |
![]() |
Gibt an, dass der aktuelle Stapelrahmen zusätzliche Informationen enthält, z. B. „Warten auf“, „Warten auf Sperre“, „Im Besitz von“ usw. |
![]() |
Gibt an, dass sich die aktuelle Aufgabe im Status „Blockiert“, „Warten“ usw. befindet. |
![]() |
Gibt die aktuell ausgeführte Aufgabe an. |
Kontextmenüelemente
Die folgenden Kontextmenüelemente sind verfügbar, wenn Sie mit der rechten Maustaste auf eine Methode in der Threads-Ansicht oder in der Aufgaben-Ansicht klicken. Die letzten sechs Elemente sind mit denen im Fenster Aufrufliste identisch.
Menüelement | Beschreibung |
---|---|
Flag | Kennzeichnet das ausgewählte Element. |
Kennzeichnung aufheben | Entmarkiert das ausgewählte Element. |
Einfrieren | Friert das ausgewählte Element ein. |
Auftauen | Reaktiviert das ausgewählte Element. |
Zu Rahmen wechseln | Dieses Element ist identisch mit dem entsprechenden Menübefehl im Fenster Aufrufliste. Im Fenster Parallele Stapel kann sich eine Methode jedoch in mehreren Rahmen befinden. Sie können den Rahmen auswählen, der im untergeordneten Menü des Elements enthalten sein soll. Wenn sich einer der Stapelrahmen im aktuellen Thread befindet, wird dieser Rahmen standardmäßig im untergeordneten Menü ausgewählt. |
Zu Aufgabe wechseln oder Zu Thread wechseln | Mit diesem Menüelement wechseln Sie zwischen den Ansichten Task und Threads. Dabei wird derselbe Stapelrahmen hervorgehoben. |
Gehe zu Quellcode | Wechselt zum entsprechenden Ort im Quellcodefenster. |
Gehe zu Demontage | Mit diesem Menüelement navigieren Sie zur entsprechenden Position im Fenster Demontage. |
Externen Code anzeigen | Zeigt externen Code an oder blendet ihn aus. |
Hexadezimale Anzeige | Schaltet zwischen dezimaler und hexadezimaler Anzeige um. |
Threads in der Quelle anzeigen | Markiert den Speicherort des Threads im Quellcodefenster. |
Symbolladeinformationen | Öffnet das Dialogfeld Symbolladeinformationen. |
Symboleinstellungen | Öffnet das Dialogfeld Symboleinstellungen. |
Menüelement | Beschreibung |
---|---|
Kopieren | Kopiert das ausgewählte Element. |
Alle Frames unterhalb von auswählen | Wählt alle Rahmen unter dem ausgewählten Stapel aus. |
Flag | Kennzeichnet das ausgewählte Element. |
Kennzeichnung aufheben | Entmarkiert das ausgewählte Element. |
Einfrieren | Friert das ausgewählte Element ein. |
Auftauen | Reaktiviert das ausgewählte Element. |
Zu Rahmen wechseln | Dieses Element ist identisch mit dem entsprechenden Menübefehl im Fenster Aufrufliste. Im Fenster Parallele Stapel kann sich eine Methode jedoch in mehreren Rahmen befinden. Sie können den Rahmen auswählen, der im untergeordneten Menü des Elements enthalten sein soll. Wenn sich einer der Stapelrahmen im aktuellen Thread befindet, wird dieser Rahmen standardmäßig im untergeordneten Menü ausgewählt. |
Zu Aufgabe wechseln oder Zu Thread wechseln | Mit diesem Menüelement wechseln Sie zwischen den Ansichten Task und Threads. Dabei wird derselbe Stapelrahmen hervorgehoben. |
Gehe zu Quellcode | Wechselt zum entsprechenden Ort im Quellcodefenster. |
Gehe zu Demontage | Mit diesem Menüelement navigieren Sie zur entsprechenden Position im Fenster Demontage. |
Externen Code anzeigen | Zeigt externen Code an oder blendet ihn aus. |
Hexadezimale Anzeige | Schaltet zwischen dezimaler und hexadezimaler Anzeige um. |
Threads in der Quelle anzeigen | Markiert den Speicherort des Threads im Quellcodefenster. |
Symbolladeinformationen | Öffnet das Dialogfeld Symbolladeinformationen. |
Symboleinstellungen | Mit diesem Menüelement wird das Dialogfeld Symboleinstellungen geöffnet. |
Threadansicht
In der Ansicht Threads werden der Stapelrahmen und der Aufrufpfad des aktuellen Threads blau hervorgehoben. Die aktuelle Position des Threads wird vom gelben Pfeil angezeigt.
Doppelklicken Sie auf eine andere Methode, um den aktuellen Stapelrahmen zu ändern. Dies kann auch zu einem Wechsel des aktuellen Threads führen, je nachdem, ob die ausgewählte Methode Teil des aktuellen oder eines anderen Threads ist.
Wenn der Graph der Ansicht Threads zu groß ist, um in das Fenster zu passen, wird im Fenster das Steuerelement Vogelperspektive angezeigt. Sie können den Rahmen im Steuerelement bewegen, um zu verschiedenen Abschnitten des Graphen zu navigieren.
In der folgenden Abbildung wird ein Thread gezeigt, der von der Main-Methode zu einem Übergang von verwaltetem zu nativem Code wechselt. In der aktuellen Methode befinden sich sechs Threads. Zwei Threads fahren mit Thread.Sleep fort, zwei weitere mit Console.WriteLine, und der aktuelle Thread fährt mit SyncTextWriter.WriteLine fort.
In der folgenden Tabelle werden die wichtigsten Funktionen der Ansicht Threads beschrieben.
Legende | Elementname | Beschreibung |
---|---|---|
1 | Aufruflistensegment oder -knoten | Dieses Element enthält eine Reihe von Methoden für einen oder mehrere Threads. Wenn keine Pfeillinien mit dem Rahmen verbunden sind, zeigt der Rahmen den gesamten Aufrufpfad für die Threads an. |
2 | Blaue Hervorhebung | Gibt den Aufrufpfad des aktuellen Threads an. |
3 | Pfeillinien | Verbinden Knoten, um den gesamten Aufrufpfad für den Thread bzw. die Threads darzustellen. |
4 | Knotenheader | Dieses Element zeigt die Anzahl der Prozesse und Threads für den Knoten an. |
5 | Methode | Stellt einen oder mehrere Stapelrahmen in derselben Methode dar |
6 | QuickInfo zur Methode | Wird angezeigt, wenn Sie auf eine Methode zeigen. In der Threadansicht zeigt die QuickInfo alle Threads in einer Tabelle ähnlich wie im Fenster Threads an. |
Die folgende Abbildung zeigt den Hauptthread beim Übergang von verwaltetem zu nativem Code. In der aktuellen Methode befinden sich fünf Threads. Vier Threads werden weiterhin im S.C.-Methodenkontext ausgeführt, während ein Arbeitsthread in einem Übergang von verwaltetem zu nativem Code fortgesetzt wird und dabei der Name des Arbeitsthreads festgelegt wird.
In der folgenden Tabelle werden die wichtigsten Funktionen der Ansicht Threads beschrieben.
Legende | Elementname | Beschreibung |
---|---|---|
1 | Aufruflistensegment oder -knoten | Dieses Element enthält eine Reihe von Methoden für einen oder mehrere Threads. Wenn keine Pfeillinien mit dem Rahmen verbunden sind, zeigt der Rahmen den gesamten Aufrufpfad für die Threads an. |
2 | Blaue Hervorhebung | Gibt den Aufrufpfad des aktuellen Threads an. |
3 | Pfeillinien | Verbinden Knoten, um den gesamten Aufrufpfad für den Thread bzw. die Threads darzustellen. |
4 | Knotenheader | Zeigt die Anzahl der Prozesse/Threads, den Threadnamen und die Thread-ID für den Knoten an. |
5 | Methode | Stellt einen oder mehrere Stapelrahmen in derselben Methode dar |
6 | QuickInfo zur Methode | Wird angezeigt, wenn Sie auf eine Methode zeigen. In der Threadansicht zeigt die QuickInfo alle Threads in einer Tabelle ähnlich wie im Fenster Threads an. |
7 | Threadbeschreibung | KI-generierte Beschreibung des Threads. Diese Beschreibung gibt es ab Visual Studio 2022, Version 17.13 Preview 1, wenn Copilot installiert und aktiviert ist. |
Aufgabenansicht
Wenn Ihre App System.Threading.Tasks.Task-Objekte (verwalteter Code) oder task_handle
-Objekte (nativer Code) verwendet, um Parallelität auszudrücken, können Sie die Ansicht Aufgaben verwenden. In der Ansicht Aufgaben werden Aufruflisten von Aufgaben anstelle von Threads angezeigt.
In der Ansicht Tasks:
- werden Aufruflisten von Threads nicht angezeigt, die keine Aufgaben ausführen.
- werden Aufruflisten von Threads, die Aufgaben ausführen, oben und unten abgeschnitten, um die relevantesten Rahmen für Aufgaben anzuzeigen.
- werden die Aufruflisten dieser Aufgaben in separaten Knoten angezeigt, wenn sich mehrere Aufgaben in einem Thread befinden.
Wechseln Sie zurück zur Ansicht Threads, indem Sie mit der rechten Maustaste in einen Stapelrahmen klicken und Zu Thread wechseln auswählen, um die gesamte Aufrufliste anzuzeigen.
In der folgenden Abbildung wird die Ansicht Threads oben und die dazugehörige Ansicht Tasks unten veranschaulicht.
Zeigen Sie mit der Maus auf eine Methode, um einen Tooltip mit zusätzlichen Informationen anzuzeigen. In der Aufgabenansicht zeigt das Tooltip alle Vorgänge in einer Tabelle an, die dem Fenster Aufgaben ähnelt.
In der folgenden Abbildung werden die QuickInfo für eine Methode in der Ansicht Threads oben und die dazugehörige Ansicht Tasks unten angezeigt.
Methodenansicht
Über die Ansichten Threads und Tasks können Sie den Graphen zur aktuellen Methode pivotieren, indem Sie auf der Symbolleiste auf das Symbol Methodenansicht umschalten klicken. Methodenansicht zeigt auf einen Blick alle Methoden aller Threads, die entweder die aktuelle Methode aufrufen oder von ihr aufgerufen werden. In der folgenden Abbildung wird veranschaulicht, wie die gleichen Informationen in der Ansicht Threads links und der Methodenansicht rechts dargestellt werden.
Wenn Sie zu einem neuen Stack-Frame wechseln, machen Sie diese Methode zur aktuellen Methode, und die Methodenansicht zeigt alle Aufrufer und Angerufenen für die neue Methode an. Dabei werden möglicherweise einige Threads in der Ansicht ein- oder ausgeblendet, je nachdem, ob die betreffende Methode in ihren Aufruflisten enthalten ist. Um zur Aufrufstapelansicht zurückzukehren, wählen Sie erneut das Symbol in der Methoden-Ansicht Symbolleiste aus.
Videotutorial zum Debuggen von Threads und Aufgaben mit parallelen Stapeln
Diese Videotutorials veranschaulichen, wie Sie die Ansichten „Threads“ und „Aufgaben“ des Fensters „Parallele Stapel“ in Visual Studio 2022 verwenden können, um Ihre Multithreadanwendungen zu debuggen.
- Debugging tasks with the Parallel Stacks window (Debuggen von Aufgaben mit dem Fenster „Parallele Stapel“)
- Debuggen von Threads im Fenster „Parallele Stapel“
Verwandter Inhalt
- Erste Schritte beim Debuggen einer Multithreading-Anwendung
- Exemplarische Vorgehensweise: Debuggen einer parallelen Anwendung
- Wechseln zu einem anderen Thread während des Debuggens in Visual Studio
- Debuggen von verwaltetem Code
- Parallele Programmierung
- Use the Tasks window (Verwenden des Fensters „Aufgaben“)
- Task-Klasse