Bereiche und Symbolgruppen

Eine Symbolgruppe enthält einen Satz von Symbolen zur effizienten Bearbeitung als Gruppe. Eine Symbolgruppe kann manuell erstellt und aufgefüllt werden oder basierend auf Symbolen in lexikalischen Bereichen, z. B. lokalen Variablen und Funktionsargumenten, automatisch generiert und aktualisiert werden. Die Schnittstelle IDebugSymbolGroup wird verwendet, um eine Symbolgruppe darzustellen.

Es gibt zwei Möglichkeiten, eine Symbolgruppe zu erstellen. Eine leere Symbolgruppe wird von CreateSymbolGroup zurückgegeben, und die Symbolgruppe für den aktuellen lexikalischen Bereich wird von GetScopeSymbolGroup zurückgegeben.

Hinweis Die aus dem aktuellen Bereich generierte Symbolgruppe ist eine Momentaufnahme der lokalen Variablen. Wenn eine Ausführung im Ziel erfolgt, sind die Symbole möglicherweise nicht mehr richtig. Wenn sich der aktuelle Bereich ändert, stellt die Symbolgruppe den aktuellen Bereich nicht mehr dar (da sie weiterhin den Bereich darstellt, für den sie erstellt wurde).

Symbole können einer Symbolgruppe mithilfe von AddSymbol hinzugefügt und mit RemoveSymbolByIndex oder RemoveSymbolByName entfernt werden. Die OutputAsType-Methode weist den Debugger an, beim Verarbeiten der Daten eines Symbols einen anderen Symboltyp zu verwenden.

Hinweis Die Werte für bereichsbezogene Symbole sind möglicherweise nicht richtig. Insbesondere können die Computerarchitektur und Compileroptimierungen verhindern, dass der Debugger den Wert eines Symbols genau bestimmt.

Die Symboleintragsinformationen sind eine Beschreibung eines Symbols, einschließlich seiner Position und seines Typs. Um diese Informationen für ein Symbol in einem Modul zu finden, verwenden Sie IDebugSymbols3::GetSymbolEntryInformation. Um diese Informationen für ein Symbol in einer Symbolgruppe zu finden, verwenden Sie IDebugSymbolGroup2::GetSymbolEntryInformation. Details zu den Symboleintragsinformationen finden Sie unter DEBUG_SYMBOL_ENTRY .

Die folgenden Methoden geben Informationen zu einem Symbol in einer Symbolgruppe zurück:

  • GetSymbolName gibt den Namen des Symbols zurück.

  • GetSymbolOffset gibt die absolute Adresse im virtuellen Adressraum des Zielsymbols zurück, wenn das Symbol eine absolute Adresse aufweist.

  • GetSymbolRegister gibt das Register zurück, das das Symbol enthält, wenn das Symbol in einem Register enthalten ist.

  • GetSymbolSize gibt die Größe der Daten für das Symbol zurück.

  • GetSymbolTypeName gibt den Namen des Symboltyps zurück.

  • GetSymbolValueText gibt den Wert des Symbols als Zeichenfolge zurück.

Wenn ein Symbol in einem Register oder in einem Speicherspeicherort gespeichert wird, der der Debugger-Engine bekannt ist, kann sein Wert mithilfe von WriteSymbol geändert werden.

Ein Symbol ist ein übergeordnetes Symbol , wenn es andere Symbole enthält. Beispielsweise enthält eine Struktur ihre Member. Ein Symbol ist ein untergeordnetes Symbol , wenn es in einem anderen Symbol enthalten ist. Ein Symbol kann sowohl ein übergeordnetes als auch ein untergeordnetes Symbol sein. Jede Symbolgruppe hat eine flache Struktur und enthält übergeordnete Symbole und ihre untergeordneten Symbole. Jedes Symbol hat eine Tiefe – Symbole ohne Eltern in der Symbolgruppe haben eine Tiefe von 0, und die Tiefe jedes untergeordneten Symbols ist um eins größer als die Tiefe des übergeordneten Symbols. Die untergeordneten Elemente eines übergeordneten Symbols können in der Symbolgruppe vorhanden sein oder nicht. Wenn die untergeordneten Elemente in der Symbolgruppe vorhanden sind, wird das übergeordnete Symbol als erweitert bezeichnet. Verwenden Sie ExpandSymbol, um die untergeordneten Elemente eines Symbols in einer Symbolgruppe hinzuzufügen oder zu entfernen.

Die Anzahl der Symbole in einer Symbolgruppe wird von GetNumberSymbols zurückgegeben. Der Index eines Symbols in einer Symbolgruppe ist eine Identifikationsnummer. der Index reicht von null bis zur Anzahl der Symbole minus 1. Jedes Mal, wenn ein Symbol zu einer Symbolgruppe hinzugefügt oder daraus entfernt wird , z. B. durch Erweitern eines Symbols, kann sich der Index aller Symbole in der Symbolgruppe ändern.

Die Symbolparameter, einschließlich Informationen zu Beziehungen zwischen übergeordneten und untergeordneten Elementen, können mithilfe von GetSymbolParameters gefunden werden. Diese Methode gibt eine DEBUG_SYMBOL_PARAMETERS-Struktur zurück.

Die Symbole in einer Symbolgruppe können mit der OutputSymbols-Methode in den Ausgabedatenstrom des Debuggers gedruckt werden.

Bereiche

Der aktuelle Bereich oder der aktuelle lokale Kontext bestimmt die lokalen Variablen, die vom Debuggermodul verfügbar gemacht werden. Der Bereich umfasst drei Komponenten:

  1. Ein Stapelrahmen.

  2. Eine aktuelle Anweisung.

  3. Ein Registrierungskontext.

Wenn sich der Stapelrahmen am oberen Rand des Aufrufstapels befindet, ist die aktuelle Anweisung die Anweisung, die zum letzten Ereignis geführt hat. Andernfalls ist die aktuelle Anweisung der Funktionsaufruf, der zum nächsthöheren Stapelrahmen führte.

Mit den Methoden GetScope und SetScope können Sie den aktuellen Bereich abrufen und festlegen. Wenn ein Ereignis auftritt, wird der aktuelle Bereich auf den Bereich des Ereignisses festgelegt. Der aktuelle Bereich kann mithilfe von ResetScope auf den Bereich des letzten Ereignisses zurückgesetzt werden.

Threadkontext

Der Threadkontext ist der Zustand, der von Windows beim Wechseln von Threads beibehalten wird. Dies ähnelt dem Registerkontext, mit dem Unterschied, dass es einen reinen Kernelprozessorzustand gibt, der Teil des Registerkontexts ist, aber nicht der Threadkontext. Dieser zusätzliche Zustand ist während des Debuggens im Kernelmodus als Register verfügbar.

Der Threadkontext wird durch die CONTEXT-Struktur dargestellt, die in ntddk.h definiert ist. Diese Struktur ist plattformabhängig, und ihre Interpretation hängt vom effektiven Prozessortyp ab. Die Methoden GetThreadContext und SetThreadContext können verwendet werden, um den Threadkontext abzurufen und festzulegen.