Verwenden des Überwachungsfensters – WinDbg (klassisch)
Im Fenster Überwachen werden Informationen zu globalen Variablen, lokalen Variablen und Registern angezeigt. Sie können dieses Fenster anpassen, um die Elemente anzuzeigen, die Sie nachverfolgen.
Öffnen des Überwachungsfensters
Klicken Sie zum Öffnen oder Wechseln zum Fenster Überwachung im Fenster WinDbg im Menü Ansicht auf Überwachen.
Sie können auch ALT+2 drücken oder auf die Schaltfläche Überwachen (ALT+2) auf der Symbolleiste klicken:
ALT+UMSCHALT+2 schließt das Überwachungsfenster.
Der folgende Screenshot zeigt ein Beispiel für ein Überwachungsfenster.
Das Überwachungsfenster kann vier Spalten enthalten. Die Spalten Name und Wert werden immer angezeigt, und die Spalten Typ und Speicherort sind optional. Um die Spalten Typ und Position anzuzeigen, klicken Sie auf der Symbolleiste auf die Schaltflächen Typecast bzw. Speicherorte .
Im Fenster Überwachen können Sie die folgenden Aktionen ausführen:
Um dem Überwachungsfenster eine Variable hinzuzufügen, wählen Sie die erste leere Zelle in der Spalte Name aus, geben Sie den Variablennamen ein, und drücken Sie dann die EINGABETASTE. Trennen Sie den Modulnamen von der Variablen durch ein Ausrufezeichen (!). Wenn Sie kein Modul angeben, wird das aktuelle Modul verwendet. Um eine Adresse in das Feld Name einzugeben, muss die Adresse mit einer Dezimalziffer beginnen (falls erforderlich, verwenden Sie das Präfix 0x).
Wenn der von Ihnen eingegebene Variablenname im Bereich der aktuellen Funktion definiert ist, wird sein Wert in der Spalte Wert angezeigt. Wenn sie nicht definiert ist, wird in der Spalte Wert"Error: Cannot get value" (Fehler: Wert kann nicht abgerufen werden) angezeigt.
Auch wenn eine Variable nicht definiert ist, kann es hilfreich sein, sie dem Überwachungsfenster hinzuzufügen. Wenn der Programmindikator eine Funktion eingibt, in der eine Variable dieses Namens definiert ist, wird deren Wert zu diesem Zeitpunkt im Fenster angezeigt.
Um eine Variable aus dem Überwachungsfenster zu entfernen, doppelklicken Sie auf ihren Namen, drücken Sie ENTF, und drücken Sie dann die EINGABETASTE. Sie können einen alten Namen auch durch einen neuen Namen ersetzen, indem Sie auf den alten Namen doppelklicken, den neuen Namen eingeben und dann die EINGABETASTE drücken.
Wenn eine Variable eine Datenstruktur ist, wird neben ihrem Namen ein Kontrollkästchen angezeigt. Aktivieren oder deaktivieren Sie das Kontrollkästchen, um die Anzeige von Strukturelementen zu erweitern und zu reduzieren.
Ganze Zahlen vom Typ int werden als Dezimalwerte angezeigt; Ganze Zahlen vom Typ UINT werden im aktuellen Radix angezeigt. Um den aktuellen Radix zu ändern, verwenden Sie den Befehl n (Set Number Base) im Debuggerbefehlsfenster.
Um den Wert einer lokalen Variablen zu ändern, doppelklicken Sie auf deren Wertzelle . Geben Sie den neuen Wert ein, oder bearbeiten Sie den alten Wert. (Die Befehle ausschneiden, kopieren und einfügen können für die Bearbeitung verwendet werden.) Der eingegebene Wert kann einen beliebigen C++-Ausdruck enthalten. Nachdem Sie einen neuen Wert eingegeben oder den alten Wert bearbeitet haben, können Sie die EINGABETASTE drücken, um den neuen Wert zu speichern, oder drücken Sie ESC, um ihn zu verwerfen. Wenn Sie einen ungültigen Wert übermitteln, wird der alte Wert erneut angezeigt, nachdem Sie die EINGABETASTE gedrückt haben.
Ganze Zahlen vom Typ int werden als Dezimalwerte angezeigt; Ganze Zahlen vom Typ UINT werden im aktuellen Radix angezeigt. Um den aktuellen Radix zu ändern, verwenden Sie den Befehl n (Set Number Base) im Debuggerbefehlsfenster.
Die Spalte Typ (wenn sie im Überwachungsfenster angezeigt wird) zeigt den aktuellen Datentyp der einzelnen Variablen an. Jede Variable wird in dem Format angezeigt, das für ihren eigenen Datentyp geeignet ist. Datenstrukturen haben ihre Typnamen in der Spalte Typ . Andere Variablentypen zeigen "Neuen Typ eingeben" in dieser Spalte an.
Wenn Sie auf "Neuen Typ eingeben" doppelklicken, können Sie den Typ umwandeln, indem Sie einen neuen Datentyp eingeben. Durch diese Umwandlung wird die aktuelle Anzeige dieser Variablen nur im Überwachungsfenster geändert. Es ändert nichts im Debugger oder auf dem Zielcomputer. Wenn Sie einen neuen Wert in die Spalte Wert eingeben, wird der text, den Sie eingeben, basierend auf dem tatsächlichen Typ des Symbols analysiert, und nicht auf einen neuen Typ, den Sie möglicherweise in der Spalte Typ eingegeben haben. Wenn Sie das Überwachungsfenster schließen und erneut öffnen, gehen die Datentypänderungen verloren.
Sie können auch einen Erweiterungsbefehl in der Spalte Typ eingeben. Der Debugger übergibt die Adresse des Symbols an diese Erweiterung und zeigt die resultierende Ausgabe in einer Reihe von reduzierbaren Zeilen unter der aktuellen Zeile an. Wenn das Symbol in dieser Zeile beispielsweise eine gültige Adresse für einen Threadumgebungsblock ist, können Sie !teb in die Spalte Typ eingeben, um die !teb-Erweiterung für die Adresse dieses Symbols auszuführen.
Die Spalte Location (sofern sie im Fenster Überwachung angezeigt wird) zeigt den Offset jedes Elements einer Datenstruktur an.
Zusätzlich zu Variablen können Sie auch die folgenden Elemente im Überwachungsfenster überwachen:
- Registriert. Wenn Sie dem Überwachungsfenster ein Register hinzufügen, stellen Sie dem Namen ein at-Zeichen (@) voran. Im Gegensatz zu Variablen können Sie Registerwerte nicht über das Überwachungsfenster ändern.
- Vtables, die Funktionszeiger enthalten. Wenn eine Vtable im Fenster Überwachung angezeigt wird, können Sie die Funktionseinträge in der Tabelle durchsuchen. Wenn eine Vtable in einer Basisklasse enthalten ist, die auf eine abgeleitete Implementierung verweist, wird die Notation _vtcast_Class angezeigt, um die Member anzugeben, die aufgrund der abgeleiteten Klasse hinzugefügt werden. Diese Member werden wie der abgeleitete Klassentyp erweitert.
- Die Rückgabewerte von Erweiterungsfunktionen, z. B. _EFN_GetPoolData.
Im Gegensatz zum Fenster Lokal ist das Überwachungsfenster von Änderungen am Registerkontext nicht betroffen. Im Fenster Überwachen können Sie nur die Variablen anzeigen und ändern, die im Bereich des aktuellen Programmzählers definiert sind.
Wenn Sie einen neuen Arbeitsbereich öffnen, werden die Inhalte des Überwachungsfensters verworfen und durch die Inhalte im neuen Arbeitsbereich ersetzt.
Symbolleiste und Kontextmenü
Das Überwachungsfenster verfügt über eine Symbolleiste, die zwei Schaltflächen (Typecast und Speicherorte) und ein Kontextmenü mit zusätzlichen Befehlen enthält. Um auf das Menü zuzugreifen, klicken Sie mit der rechten Maustaste auf die Titelleiste des Fensters, oder klicken Sie auf das Symbol in der oberen rechten Ecke des Fensters:
Die Symbolleiste und das Menü enthalten die folgenden Schaltflächen und Befehle:
(Symbolleiste und Menü) Typecast schaltet die Anzeige der Spalte Typ ein und aus.
(Symbolleiste und Menü) Locations aktiviert und deaktiviert die Anzeige der Spalte Position .
(Nur Menü) Zeigen Sie 16-Bit-Werte als Unicode-Zeichenfolgen in diesem Fenster an. Dieser Befehl aktiviert und deaktiviert eine globale Einstellung, die sich auf das Fenster Lokal, das Überwachungsfenster und die Ausgabe des Debuggerbefehls auswirkt. Dieser Befehl entspricht der Verwendung des Befehls .enable_unicode (Unicode-Anzeige aktivieren).
(Nur Menü) Das Anzeigen von Zahlen im Standardradiix bewirkt, dass ganze Zahlen im Standardradix angezeigt werden, anstatt sie immer im Dezimalformat anzuzeigen. Dieser Befehl aktiviert und deaktiviert eine globale Einstellung, die sich auf das Fenster Lokal, das Überwachungsfenster und die Ausgabe des Debuggerbefehls auswirkt. Dieser Befehl entspricht der Verwendung des Befehls .force_radix_output (Radix für Ganze Zahlen verwenden).
Hinweis Der Befehl Always display numbers in default radix hat keine Auswirkungen auf lange ganze Zahlen. Lange ganze Zahlen werden im Dezimalformat angezeigt, es sei denn, der Befehl .enable_long_status (Long Integer Display aktivieren) wird verwendet. Der Befehl .enable_long_status wirkt sich auf die Anzeige im Fenster Lokal, im Fenster Überwachen und im Debuggerbefehl aus. Es gibt keine Entsprechung für diesen Befehl im Menü im Überwachungsfenster.
(Nur Menü) Öffnen Des Speicherfensters für den ausgewählten Wert wird ein neues angedocktes Speicherfenster geöffnet, in dem der Arbeitsspeicher ab der Adresse des ausgewählten Ausdrucks angezeigt wird.
(Nur Menü) Beim Aufrufen von dt für den ausgewählten Speicherwert wird der Befehl dt (Anzeigetyp) mit dem ausgewählten Symbol als Parameter ausgeführt. Das Ergebnis wird im Fenster Debuggerbefehl angezeigt. Die Option -n wird automatisch verwendet, um das Symbol von einer hexadezimalen Adresse zu unterscheiden. Es werden keine anderen Optionen verwendet. Beachten Sie, dass der mit dieser Menüauswahl erstellte Inhalt mit dem Inhalt identisch ist, der beim Ausführen des Dt-Befehls über die Befehlszeile erzeugt wird, das Format jedoch etwas anders ist.
(Nur Menü) Symbolleiste aktiviert und deaktiviert die Symbolleiste.
(Nur Menü) Andocken oder Ausdocken bewirkt, dass das Fenster in den angedockten Zustand wechselt oder verlässt.
(Nur Menü) Wenn Sie in ein neues Dock wechseln , wird das Überwachungsfenster geschlossen und in einem neuen Dock geöffnet.
(Nur Menü) Als Tab-Dock-Ziel für den Fenstertyp festgelegt ist für das Überwachungsfenster nicht verfügbar. Diese Option ist nur für Quell- oder Speicherfenster verfügbar.
(Nur Menü) Immer schwebend bewirkt, dass das Fenster nicht angedockt wird, auch wenn es an einen Andockort gezogen wird.
(Nur Menü) Durch Verschieben mit Frame wird das Fenster verschoben, wenn der WinDbg-Frame verschoben wird, auch wenn das Fenster abgedockt ist.
(Nur Menü) Hilfe öffnet dieses Thema in der Dokumentation Debugtools für Windows.
(Nur Menü) Schließen schließt dieses Fenster.
Weitere Informationen
Weitere Informationen zum Steuern von Variablen und eine Beschreibung anderer speicherbezogener Befehle finden Sie unter Lesen und Schreiben von Arbeitsspeicher. Weitere Informationen zu Registern und deren Bearbeitung finden Sie unter Anzeigen und Bearbeiten von Registern in WinDbg (klassisch).