Anzeigen von Threads und Tasks im Fenster „Parallele Stapel“ (C#, Visual Basic, C++)
Das Fenster Parallele Stapel ist beim Debuggen von Multithreadanwendungen hilfreich. 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 Aufgabenansicht werden aufgabenorientierte 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“
Sie müssen sich in einer Debugsitzung befinden, um das Fenster Parallele Stapel zu öffnen. Klicken Sie auf Debuggen>Fenster>Parallele Stapel.
Symbolleisten-Steuerelemente
Das Fenster Parallele Stapel enthält die folgenden Symbolleisten-Steuerelemente:
Symbol | Steuerelement | Beschreibung |
---|---|---|
Kombinationsfeld Threads/Aufgaben | Schaltet die Ansicht zwischen Aufruflisten von Threads und Aufruflisten von Aufgaben um. Weitere Informationen finden Sie unter Aufgabenansicht und Threadansicht. | |
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. | |
Automatischen Bildlauf 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 Stapelrahmen über andere Fenster ändern oder wenn Sie einen neuen Haltepunkt in großen Graphen erreichen. | |
Zoomsteuerung ein- bzw. ausschalten | Mit dieser Option wird das Zoomsteuerelement auf der linken Seite des Fensters ein- und ausgeblendet. Unabhängig davon, ob das Zoomsteuerelement angezeigt wird, können Sie auch herein- und herauszoomen, indem Sie STRG drücken und das Mausrad drehen oder indem Sie STRG+UMSCHALT++ zum Hereinzoomen und STRG+UMSCHALT+- zum Herauszoomen drücken. |
Symbol | Steuerelement | Beschreibung |
---|---|---|
Kombinationsfeld Threads/Aufgaben | Schaltet die Ansicht zwischen Aufruflisten von Threads und Aufruflisten von Aufgaben um. Weitere Informationen finden Sie unter Aufgabenansicht und Threadansicht. | |
Filtersteuerelement | Zeigt Aufruflisten nur für die spezifische Gruppe von Threads an, die Sie interessieren. | |
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. | |
Automatischen Bildlauf 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 Stapelrahmen über andere Fenster ändern oder wenn Sie einen neuen Haltepunkt in großen Graphen erreichen. | |
Zoomsteuerung ein- bzw. ausschalten | Mit dieser Option wird das Zoomsteuerelement auf der linken Seite des Fensters ein- und ausgeblendet. Unabhängig davon, ob das Zoomsteuerelement angezeigt wird, können Sie auch herein- und herauszoomen, indem Sie STRG drücken und das Mausrad drehen oder indem Sie STRG+UMSCHALT++ zum Hereinzoomen und STRG+UMSCHALT+- zum Herauszoomen drücken. |
|
Suchsteuerelement | Mit dieser Funktion können Sie einfach Stapelrahmen durchsuchen und dann Pfeile verwenden, um zwischen diesen Ergebnissen zu navigieren. | |
Steuerelement „Speichern“ | Ermöglicht das Speichern/Exportieren des Inhalts aus dem Fenster mit parallelen Stapeln als Bild. | |
Steuerelement „Externen Code anzeigen“ | Mit diesem Feature können Sie die Stapel im externen Code/in den externen Bibliotheken ein- und ausblenden. |
Stapelrahmensymbole
Die folgenden Symbole geben Informationen zu den aktiven und aktuellen Stapelrahmen in allen Ansichten an:
Symbol | Beschreibung |
---|---|
Dieses Symbol gibt die aktuelle Position (aktiver Stapelrahmen) des aktuellen Threads an. | |
Dieses Symbol gibt die aktuelle Position (aktiver Stapelrahmen) von nicht aktuellen Threads an. | |
Dieses Symbol gibt den aktuellen Stapelrahmen an (aktueller Debuggerkontext). Der Methodenname wird immer fett formatiert. |
Symbol | Beschreibung |
---|---|
Dieses Symbol gibt die aktuelle Position (aktiver Stapelrahmen) des aktuellen Threads an. | |
Dieses Symbol gibt die aktuelle Position (aktiver Stapelrahmen) von nicht aktuellen Threads an. | |
Dieses Symbol gibt den aktuellen Stapelrahmen an (aktueller Debuggerkontext). 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 Knoten mit Deadlock 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 an, dass derzeit ein Task ausgeführt wird. |
Kontextmenüelemente
Die folgenden Kontextmenüelemente sind verfügbar, wenn Sie mit der rechten Maustaste auf eine Methode in den Ansichten Threads oder Aufgaben klicken. Die letzten sechs Elemente sind mit denen im Aufruflistenfenster identisch.
Menüoption | Beschreibung |
---|---|
Kennzeichnen | Kennzeichnet das ausgewählte Element. |
Kennzeichnung aufheben | Hebt die Kennzeichnung des ausgewählten Elements auf. |
Einfrieren | Friert das ausgewählte Element ein. |
Reaktivieren | 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. |
Zur Aufgabe wechseln oder Gehe zu Thread | Mit diesem Menüelement wechseln Sie zwischen den Ansichten Aufgabe und Threads. Dabei wird derselbe Stapelrahmen hervorgehoben. |
Gehe zu Quellcode | Mit diesem Menüelement navigieren Sie zur entsprechenden Position im Quellcodefenster. |
Zu Disassemblierung wechseln | Mit diesem Menüelement navigieren Sie zur entsprechenden Position im Fenster Disassemblierung. |
Externen Code anzeigen | Blendet externen Code ein bzw. aus. |
Hexadezimale Anzeige | Schaltet zwischen dezimaler und hexadezimaler Anzeige um. |
Threads in Quelle anzeigen | Mit diesem Menüelement wird die Position des Threads im Quellcodefenster hervorgehoben. |
Symbolladeinformationen | Mit diesem Menüelement wird das Dialogfeld Symbolladeinformationen geöffnet. |
Symboleinstellungen | Mit diesem Menüelement wird das Dialogfeld Symboleinstellungen geöffnet. |
Menüoption | BESCHREIBUNG |
---|---|
Copy | Kopiert das ausgewählte Element. |
Alle Rahmen auswählen unter | Wählt alle Rahmen unter dem ausgewählten Stapel aus. |
Kennzeichnen | Kennzeichnet das ausgewählte Element. |
Kennzeichnung aufheben | Hebt die Kennzeichnung des ausgewählten Elements auf. |
Einfrieren | Friert das ausgewählte Element ein. |
Reaktivieren | 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. |
Zur Aufgabe wechseln oder Gehe zu Thread | Mit diesem Menüelement wechseln Sie zwischen den Ansichten Aufgabe und Threads. Dabei wird derselbe Stapelrahmen hervorgehoben. |
Gehe zu Quellcode | Mit diesem Menüelement navigieren Sie zur entsprechenden Position im Quellcodefenster. |
Zu Disassemblierung wechseln | Mit diesem Menüelement navigieren Sie zur entsprechenden Position im Fenster Disassemblierung. |
Externen Code anzeigen | Blendet externen Code ein bzw. aus. |
Hexadezimale Anzeige | Schaltet zwischen dezimaler und hexadezimaler Anzeige um. |
Threads in Quelle anzeigen | Mit diesem Menüelement wird die Position des Threads im Quellcodefenster hervorgehoben. |
Symbolladeinformationen | Mit diesem Menüelement wird das Dialogfeld Symbolladeinformationen geöffnet. |
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. Ein Thread wird mit „Thread.Sleep“ fortgesetzt, während ein anderer mit „Console.WriteLine“ und dann mit „SyncTextWriter.WriteLine“ fortfährt.
In der folgenden Tabelle werden die Hauptfeatures 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 | Diese 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 | Dieses Element 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. |
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 fünf Threads. Einer wechselt zu „ServerClass.InstanceMethod“, ein anderer zu „Worker.Thread.Start“ und dann zu „StartupHook.Initialize.AnonymousMethod“.
In der folgenden Tabelle werden die Hauptfeatures 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 | Diese 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 | Dieses Element 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. |
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 Aufgabenansicht werden Aufruflisten von Aufgaben anstelle von Threads angezeigt.
In der Ansicht Aufgaben:
- 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 Gehe zu Thread auswählen, um die gesamte Aufrufliste anzuzeigen.
In der folgenden Abbildung wird die Ansicht Threads oben und die dazugehörige Ansicht Aufgaben unten veranschaulicht.
Zeigen Sie auf eine Methode, um eine QuickInfo mit zusätzlichen Informationen anzuzeigen. In der Ansicht Aufgaben zeigt die QuickInfo ähnlich wie im Fenster Aufgaben alle Aufgaben in einer Tabelle.
In der folgenden Abbildung werden die QuickInfo für eine Methode in der Ansicht Threads oben und die dazugehörige Ansicht Aufgaben unten angezeigt.
Methodenansicht
Über die Ansichten Threads und Aufgaben können Sie den Graphen zur aktuellen Methode pivotieren, indem Sie in der Symbolleiste auf das Symbol Methodenansicht umschalten klicken. In der Methodenansicht werden alle Methoden für sämtliche Threads in einem Blick angezeigt, die entweder Aufrufer oder Aufgerufene der aktuellen Methode sind. 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 Stapelrahmen wechseln, legen Sie diese Methode als aktuelle Methode fest und die Methodenansicht zeigt alle Aufrufer und Aufgerufenen für die neue Methode an. Dabei werden möglicherweise einige Threads in der Ansicht eingeblendet oder ausgeblendet, je nachdem, ob die betreffende Methode in ihren Aufruflisten enthalten ist. Klicken Sie wieder auf das Symbol Methodenansicht in der Symbolleiste, um zur Aufruflistenansicht zurückzukehren.
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“)
- Debugging threads with the Parallel Stacks window (Debuggen von Threads mit dem Fenster „Parallele Stapel“)
Zugehöriger Inhalt
- Erste Schritte zum Debuggen von Multithreadanwendungen (C#, Visual Basic, C++)
- Exemplarische Vorgehensweise: Debuggen einer parallelen Anwendung
- Vorgehensweise: Wechseln zu einem anderen Thread während des Debuggens in Visual Studio (C#, Visual Basic, C++)
- Debuggen von verwaltetem Code
- Parallele Programmierung
- Use the Tasks window (Verwenden des Fensters „Aufgaben“)
- Task class (Task-Klasse)