Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Ein Thread ist eine Abfolge von Anweisungen, denen das Betriebssystem Prozessorzeit gewährt. Jeder Prozess, der im Betriebssystem ausgeführt wird, besteht aus mindestens einem Thread. Prozesse mit mehr als einem Thread werden als Multithread bezeichnet.
Computer mit mehreren Prozessoren, Multikernprozessoren oder Hyperthreadingprozessen können mehrere gleichzeitige Threads ausführen. Parallele Verarbeitung mit vielen Threads kann die Programmleistung erheblich verbessern, aber es kann auch das Debuggen erschweren, da Sie viele Threads nachverfolgen.
Perfekte Parallelverarbeitung ist nicht immer möglich. Threads müssen manchmal synchronisiert werden. Möglicherweise muss ein Thread auf ein Ergebnis eines anderen Threads warten, oder ein Thread benötigt möglicherweise exklusiven Zugriff auf eine Ressource, die ein anderer Thread verwendet. Synchronisierungsprobleme sind eine häufige Ursache für Fehler in Multithread-Anwendungen. Manchmal warten Threads möglicherweise auf eine Ressource, die nie verfügbar wird. Dies führt zu einer Bedingung namens Deadlock.
Threads und Prozesse
Threads und Prozesse sind verwandte Konzepte in der Informatik. Beide stellen Sequenzen von Anweisungen dar, die in einer bestimmten Reihenfolge ausgeführt werden müssen. Anweisungen in separaten Threads oder Prozessen können jedoch parallel ausgeführt werden.
Prozesse sind im Betriebssystem vorhanden und entsprechen dem, was Benutzer als Programme oder Anwendungen sehen. Ein Thread ist dagegen innerhalb eines Prozesses vorhanden. Aus diesem Grund werden Threads manchmal als leichtgewichtige Prozesse bezeichnet. Jeder Prozess besteht aus einem oder mehreren Threads.
Das Vorhandensein mehrerer Prozesse ermöglicht es einem Computer, mehrere Aufgaben gleichzeitig auszuführen. Durch das Vorhandensein mehrerer Threads kann ein Prozess die parallele Ausführung von Arbeiten trennen. Auf einem Computer mit Multiprozessoren können Prozesse oder Threads auf verschiedenen Prozessoren ausgeführt werden. Dies ermöglicht eine echte parallele Verarbeitung.
Tools zum Debuggen von Multithread-Apps
Visual Studio bietet verschiedene Tools zum Debuggen von Multithread-Apps.
Bei Threads sind die primären Tools zum Debuggen von Threads das Fenster "Parallele Stapel" , das Fenster " Parallele Überwachung ", Threadmarkierungen in Quellfenstern, das Fenster "Threads " und die Symbolleiste " Debugspeicherort ". Weitere Informationen zur Threads-Ansicht in parallelen Stapeln finden Sie unter Debuggen eines Deadlocks mithilfe der Threads-Ansicht. Informationen zum Verwenden der Parallel Stacks - und Parallel Watch-Fenster finden Sie unter "Erste Schritte beim Debuggen einer Multithreadanwendung". Im Einführungsartikel wird gezeigt, wie Threadmarkierungen verwendet werden. Siehe auch Exemplarische Vorgehensweise: Debuggen einer C++AMP-Anwendung.
Für .NET-Code, der asynchron verwendet wird, sind die primären Tools zum Debuggen die Ansicht "Aufgaben" im Fenster "Parallele Stapel". Informationen zu den ersten Schritten finden Sie unter Debuggen einer asynchronen Anwendung (.NET).
Für das Debuggen von Threads auf der GPU ist das primäre Tool das Fenster "GPU-Threads ". Siehe Vorgehensweise: Verwenden des GPU-Threads-Fensters.
Bei Prozessen sind die primären Tools das Dialogfeld "An Prozess anhängen", das Fenster "Prozesse" und die Symbolleiste "Debug-Standort".
Visual Studio bietet auch leistungsstarke Haltepunkte und Nachverfolgungspunkte, die beim Debuggen von Multithread-Anwendungen nützlich sein können. Verwenden Sie Haltepunktbedingungen und Filter, um Haltepunkte in einzelnen Threads zu platzieren. Tracepoints ermöglichen es Ihnen, die Ausführung Ihres Programms ohne Unterbrechung zu verfolgen, um Probleme wie Deadlocks zu untersuchen. Weitere Informationen finden Sie unter Haltepunktaktionen und Ablaufverfolgungspunkte.
Das Debuggen einer Multithreadanwendung mit einer Benutzeroberfläche kann besonders schwierig sein. Sie können die Anwendung auf einem zweiten Computer ausführen und das Remotedebugging verwenden. Weitere Informationen finden Sie unter Remotedebugging.
In der folgenden Tabelle sind die verfügbaren Informationen und die Aktionen aufgeführt, die Sie an jedem dieser Stellen ausführen können:
| Benutzeroberfläche | Verfügbare Informationen | Aktionen, die Sie ausführen können |
|---|---|---|
| Dialogfeld "An Prozess anhängen " | Verfügbare Prozesse, an die Sie anfügen können: - Prozessname (.exe) - Prozess-ID-Nummer - Menüleistentitel - Typ (Managed v4.0; Managed v2.0, v1.1, v1.0; x86; x64; IA64) - Benutzername (Kontoname) - Sitzungsnummer |
Einen Prozess zum Anhängen auswählen Auswählen eines Remotecomputers Ändern des Transporttyps für die Verbindung mit Remotecomputern |
| Fenster "Prozesse " | Angefügte Prozesse: - Prozessname - Prozess-ID-Nummer - Pfad zum Prozess .exe - Menüleistentitel - Zustand (Unterbrechung. Läuft) - Debuggen (systemeigenes, verwaltetes usw.) - Transporttyp (Standard, nativ ohne Authentifizierung) - Transportqualifizierer (Remotecomputer) |
Werkzeuge: - Befestigen - Abtrennen -Beenden Schnellzugriffsmenü - Befestigen - Abtrennen – Trennen, wenn das Debuggen beendet wurde -Beenden |
| Debug-Positions-Symbolleiste | - Aktueller Prozess - Anhalten der Anwendung - Fortsetzen der Anwendung – Anhalten und Beenden der Anwendung - Aktueller Thread - Umschalten des aktuellen Threadkennzeichnungszustands - Nur gekennzeichnete Threads anzeigen - Nur aktuellen Prozess anzeigen - Aktueller Stapelrahmen |
- Wechseln zu einem anderen Prozess – Anhalten, Fortsetzen oder Herunterfahren der Anwendung - Wechseln zu einem anderen Thread im aktuellen Prozess - Wechseln zu einem anderen Stackframe im aktuellen Thread - Kennzeichnen oder Aufheben der Kennzeichnung aktueller Threads - Nur gekennzeichnete Threads anzeigen - Nur den aktuellen Prozess anzeigen |
| Fenster "Parallele Stapel" | – Aufrufstapel für mehrere Threads in einem Fenster. - Aktiver Stack-Frame für jeden Thread. – Aufrufer und Angerufene für jede Methode. - Deadlock-Erkennung |
- Filtert die angegebenen Threads aus - Herausfiltern von externen Codestapeln – Zur Ansicht "Vorgänge" wechseln - Einen Thread kennzeichnen oder die Markierung aufheben -Zoom - Kopieren von Stack-Frames - Speichern/Exportieren aller Stapel als Bild |
| Fenster "Parallele Überwachung " | - Die Flaggen-Spalte, in der Sie einen Thread markieren können, dem Sie besondere Aufmerksamkeit schenken möchten. - Die Rahmenspalte, in der ein Pfeil den ausgewählten Rahmen angibt. – Eine konfigurierbare Spalte, die den Computer, den Prozess, die Kachel, die Aufgabe und den Thread anzeigen kann. |
- Einen Thread kennzeichnen oder die Markierung aufheben - Nur gekennzeichnete Threads anzeigen - Frames wechseln - Sortieren einer Spalte - Gruppenthreads - Einfrieren oder Auftauen von Threads - Exportieren der Daten im Fenster "Parallele Überwachung" |
| Threads-Fenster | Threads im aktuellen Prozess: – Thread-ID - Verwaltete ID - Kategorie (Hauptthread, Schnittstellenthread, Remoteprozeduraufrufhandler oder Workerthread) - Threadname – Speicherort, an dem thread erstellt wird -Priorität - Affinitätsmaske - Angehaltene Anzahl - Prozessname - Flaggenindikator - Angehaltener Indikator |
Werkzeuge: -Suchen - Suchaufrufliste - Nur meinen Code markieren - Benutzerdefinierte Modulauswahl kennzeichnen - Gruppieren nach - Spalten - Erweitern/Reduzieren von Rufstapeln - Erweitern/Reduzieren von Gruppen - Einfrieren/Auftauen Threads Schnellzugriffsmenü - Threads in der Quelle anzeigen - Wechseln zu einem Thread - Einfrieren eines ausgeführten Threads - Tauen eines eingefrorenen Fadens - Einen Thread zur weiteren Analyse kennzeichnen - Die Markierung bei einem Thread aufheben - Umbenennen eines Threads - Ein- und Ausblenden von Threads Andere Aktionen: – Anzeigen des Aufrufstapels für einen Thread in einer Dateninfo |
| Quellfenster | Threadindikatoren in der linken Leiste zeigen einzelne oder mehrere Threads an (standardmäßig deaktiviert, können im Threads-Fenster über das Kontextmenü aktiviert werden) | Schnellzugriffsmenü - Wechseln zu einem Thread - Einen Thread zur weiteren Analyse kennzeichnen - Die Markierung bei einem Thread aufheben |
| Aufgabenfenster | – Anzeigen von Informationen zu Task Objekten, einschließlich Aufgaben-ID, Aufgabenstatus (geplant, Ausführen, Warten, Deadlocked), und welcher Thread der Aufgabe zugewiesen ist. – Aktueller Standort im Anrufstapel. – Stellvertretung, die zur Erstellungszeit an die Aufgabe übergeben wurde |
- Wechseln zur aktuellen Aufgabe - Kennzeichnen oder Aufheben einer Aufgabe – Einfrieren oder Auftauen einer Aufgabe |
| GPU-Threads-Fenster | - Die Flaggen-Spalte, in der Sie einen Thread markieren können, dem Sie besondere Aufmerksamkeit schenken möchten. - Die aktuelle Threadspalte, in der ein gelber Pfeil den aktuellen Thread angibt. - Die Spalte " Threadanzahl ", in der die Anzahl der Threads an derselben Position angezeigt wird. - Die Spalte "Zeile ", in der die Codezeile angezeigt wird, in der sich jede Gruppe von Threads befindet. - Die Spalte "Adresse ", in der die Anweisungsadresse angezeigt wird, in der sich jede Gruppe von Threads befindet. - Die Spalte "Ort ", die die Position im Code der Adresse ist. – Die Spalte "Status ", in der angezeigt wird, ob der Thread aktiv oder blockiert ist. - Die Kachelspalte , in der der Kachelindex für die Threads in der Zeile angezeigt wird. |
- Ändern in einen anderen Thread - Anzeigen einer bestimmten Kachel und eines bestimmten Threads - Ein- oder Ausblenden einer Spalte - Sortieren nach einer Spalte - Gruppenthreads - Einfrieren oder Auftauen von Threads - Einen Thread kennzeichnen oder die Markierung aufheben - Nur gekennzeichnete Threads anzeigen |