Debuggen von Threads und Prozessen in Visual Studio
Artikel
Threads und Prozesse sind verwandte Konzepte der Informatik. Beide stellen Folgen von Anweisungen dar, die in einer bestimmten Reihenfolge ausgeführt werden müssen. Anweisungen von verschiedenen Threads oder Prozessen können aber parallel ausgeführt werden.
Prozesse werden im Betriebssystem verwaltet und entsprechen dem, was Benutzer als Programme oder Anwendungen sehen. Ein Thread hingegen wird von einem Prozess verwaltet. Aus diesem Grund werden Threads gelegentlich als Lightweightprozesse bezeichnet. Jeder Prozess besteht aus einem oder mehreren Threads.
Die Möglichkeit, mehrere Prozesse auszuführen, versetzt einen Computer in die Lage, mehr als eine Aufgabe gleichzeitig auszuführen. Das Vorhandensein mehrerer Threads versetzt einen Prozess in die Lage, Arbeiten so aufzuteilen, dass sie parallel ausgeführt werden können. Auf einem Computer mit Multiprozessoren können Prozesse oder Threads auf verschiedenen Prozessoren ausgeführt werden. Dies ermöglicht eine echte Parallelverarbeitung.
Echte Parallelverarbeitung ist nicht immer möglich. Threads müssen manchmal synchronisiert werden. Ein Thread muss möglicherweise auf das Ergebnis eines anderen Threads warten, oder ein Thread benötigt exklusiven Zugriff auf eine Ressource, die von einem anderen Thread verwendet wird. Synchronisierungsprobleme sind eine häufige Ursache von Programmfehlern in Multithreadanwendungen. Es kann passieren, dass Threads auf eine Ressource warten, die nie verfügbar wird. Dies führt zu einem Zustand, der Deadlock genannt wird.
Der Visual Studio-Debugger stellt leistungsstarke und benutzerfreundliche Tools zum Debuggen von Threads und Prozessen bereit.
Tools zum Debuggen von Threads und Prozessen in Visual Studio
Die wichtigsten Tools für die Arbeit mit Prozessen in Visual Studio sind das Dialogfeld An den Prozess anhängen sowie das Prozessfenster und die Symbolleiste Debugspeicherort. Die wichtigsten Tools für das Debuggen von Threads sind das Threadfenster, Threadmarker in Quellcodefenstern sowie die Symbolleiste Debugspeicherort.
Die wichtigsten Tools zum Debuggen von Multithreadanwendungen sind die Fenster Parallele Stapel, Parallele Aufgaben, Parallele Überwachung und GPU-Threads.
In der folgenden Tabelle sind die verfügbaren Informationen und die an jeder Stelle möglichen Aktionen aufgeführt:
Benutzeroberfläche
Verfügbare Informationen
Ausführbare Aktionen
Dialogfeld An den Prozess anhängen
Verfügbare Prozesse, an die angehängt werden kann:
Prozessname (.exe)
Prozess-ID-Nummer
Menüleistentitel
Typ (Managed v4.0; Managed v2.0, v1.1, v1.0; x86; x64; IA64)
Benutzername (Kontoname)
Sitzungsnummer
Auswählen eines Prozesses, an den angehängt werden soll
Auswählen eines Remotecomputers
Ändern des Transporttyps für die Verbindung mit Remotecomputern
Prozessfenster
Angehängte Prozesse:
Prozessname
Prozess-ID-Nummer
Pfad zur EXE-Datei des Prozesses
Menüleistentitel
Zustand (Unterbrechen, Aktiv)
Debuggen (Systemeigen, Verwaltet usw.)
Transporttyp (standardmäßig, systemeigen ohne Authentifizierung)
Transportqualifizierer (Remotecomputer)
Tools:
Anfügen
Trennen
Beenden
Kontextmenü:
Anfügen
Trennen
Nach Beenden des Debuggens trennen
Beenden
Threadfenster
Threads in aktuellem Prozess:
Thread-ID
Verwaltete ID
Kategorie (Hauptthread, Benutzeroberflächenthread, Remoteprozeduraufruf-Handler oder Arbeitsthread)
Thread Name
Ort, an dem der Thread erstellt wird
Priorität
Affinitätsmaske
Angehaltene Anzahl
Prozessname
Kennzeichenindikator
Angehaltener Indikator
Tools:
Suche
Aufrufliste suchen
Nur eigenen Code kennzeichnen
Benutzerdefinierte Modulauswahl kennzeichnen
Gruppieren nach
Columns
Aufruflisten erweitern/reduzieren
Gruppen erweitern/reduzieren
Threads sperren/entsperren
Kontextmenü:
Threads in Quelle anzeigen
Zu Thread wechseln
Ausgeführten Thread sperren
Gesperrten Thread entsperren
Thread zur weiteren Überprüfung kennzeichnen
Kennzeichnung eines Threads aufheben
Thread umbenennen
Threads anzeigen und ausblenden
Sonstige Aktionen:
Aufrufliste für einen Thread in einem DataTip anzeigen
Quellcodefenster
Threadindikatoren im linken Bundsteg geben einzelne oder mehrere Threads an (standardmäßig deaktiviert, die Aktivierung erfolgt über das Kontextmenü im Fenster Threads)
Kontextmenü:
Zu Thread wechseln
Thread zur weiteren Überprüfung kennzeichnen
Kennzeichnung eines Threads aufheben
Symbolleiste Debugspeicherort
Aktueller Prozess
Miniaturansicht der Anwendung anzeigen
Anwendung anhalten
Anwendung fortsetzen
Anwendung anhalten und herunterfahren
Aktueller Thread
Aktuellen Status des Thread-Flags umkehren
Nur gekennzeichnete Threads anzeigen
Nur aktuellen Prozess anzeigen
Aktueller Stapelrahmen
Zu einem anderen Prozess wechseln
Anwendung anhalten, fortsetzen oder herunterfahren
Zu einem anderen Thread im aktuellem Prozess wechseln
Zu einem anderen Stapelrahmen in aktuellem Thread wechseln
Kennzeichnen bzw. Aufheben der Kennzeichnung von aktuellen Threads
Nur gekennzeichnete Threads anzeigen
Nur den aktuellen Prozess anzeigen
Fenster Parallele Stapel
Aufruflisten für mehrere Threads in einem Fenster.
Aktiver Stapelrahmen für jeden Thread.
Aufrufer und Aufgerufene für die einzelnen Methoden.
Herausfiltern bestimmter Threads
Wechseln zur Ansicht Parallele Aufgaben
Kennzeichnen bzw. Aufheben der Kennzeichnung eines Threads
Zoom
Fenster Parallele Aufgaben
Anzeigen von Informationen zu Task-Objekten, einschließlich der Aufgaben-ID, des Aufgabenstatus (geplant, ausgeführt, wartend, blockiert) und der der Aufgabe zugewiesenen Threads.
Aktuelle Position in der Aufrufliste.
Zur Erstellungszeit an die Aufgabe übergebener Delegat
Wechseln zur aktuellen Aufgabe
Kennzeichnen oder Aufheben der Kennzeichnung einer Aufgabe
Einfrieren oder Reaktivieren einer Aufgabe
Fenster Parallele Überwachung
Die Kennzeichenspalte, in der Sie einen Thread markieren können, der besondere Aufmerksamkeit erhalten soll.
Die Framespalte, in der ein Pfeil den ausgewählten Frame angibt.
Eine konfigurierbare Spalte, in der der Computer, der Prozess, die Kachel, die Aufgabe und der Thread angezeigt werden können.
Kennzeichnen bzw. Aufheben der Kennzeichnung eines Threads
Nur gekennzeichnete Threads anzeigen
Frames wechseln
Spalte sortieren
Threads gruppieren
Threads einfrieren oder reaktivieren
Daten in das parallele Überwachungsfenster exportieren
Fenster GPU-Threads
Die Kennzeichenspalte, in der Sie einen Thread markieren können, der besondere Aufmerksamkeit erhalten soll.
Die Spalte mit aktiven Threads, in der ein gelber Pfeil einen aktiven Thread anzeigt. Ein Pfeil gibt den Thread an, in dem die Ausführung durch den Debugger unterbrochen wurde.
Die Spalte Threadanzahl, in der die Anzahl von Threads an derselben Position angezeigt wird.
Die Spalte Zeile, in der die Codezeile angezeigt wird, in der sich die jeweilige Threadgruppe befindet.
Die Spalte Adresse, in der die Anweisungsadresse angezeigt wird, in der sich die jeweilige Threadgruppe befindet.
Die Spalte Speicherort, in der der Ort im Code die Adresse angegeben ist.
Die Spalte Status, in der angegeben ist, ob der Thread aktiv oder blockiert ist.
Die Spalte Kachel, in der der Kachelindex für die Threads in der Zeile angezeigt wird.
Zu einem anderen aktiven Thread wechseln
Bestimmte Kachel und bestimmten Thread anzeigen
Spalte ein- oder ausblenden
Nach Spalte sortieren
Threads gruppieren
Threads einfrieren oder reaktivieren
Kennzeichnen bzw. Aufheben der Kennzeichnung eines Threads