Steuern von Breakpointflags und -parametern
Es gibt eine Reihe von Methoden, die verwendet werden können, um grundlegende Informationen zu Haltepunkten zu ermitteln:
GetId gibt die Breakpoint-ID zurück.
GetType gibt den Haltepunkttyp (Software oder Prozessor) und den Typ des effektiven Prozessors zurück, für den der Haltepunkt festgelegt ist.
GetAdder gibt den Client zurück, der den Haltepunkt hinzugefügt hat.
GetOffset gibt die Adresse eines Haltepunkts zurück.
GetOffsetExpression gibt die Ausdruckszeichenfolge zurück, die den Speicherort des Haltepunkts angibt.
Zusätzlich zu seiner Position und dem Haltepunkttyp verfügt ein Haltepunkt über mehrere Parameter, die sein Verhalten steuern.
Breakpointparameter können über eine Vielzahl spezifischer Methoden gesteuert werden. Darüber hinaus können die meisten Parameter mithilfe von GetParameters zusammen abgefragt werden.
Breakpointflags
Breakpointflags sind eine Art von Haltepunktparametern.
Breakpointflags können mithilfe von GetFlags abgefragt werden. Sie können mithilfe von AddFlags, RemoveFlags oder SetFlags geändert werden.
Breakpointflags bilden ein Bitfeld. Die möglichen Flags, die in diesem Bitfeld verwendet werden können, und ihre Bedeutungen sind wie folgt:
DEBUG_BREAKPOINT_ENABLED
Wenn dieses Flag festgelegt ist, ist der Haltepunkt aktiviert und hat seine normale Wirkung. Wenn dieses Flag nicht festgelegt ist, ist der Haltepunkt deaktiviert und hat keine Auswirkungen. Wenn Sie einen Haltepunkt vorübergehend deaktivieren möchten, können Sie dieses Flag entfernen. Es ist dann einfach, dieses Flag wieder hinzuzufügen, wenn Sie diesen Haltepunkt erneut aktivieren möchten.
DEBUG_BREAKPOINT_ADDER_ONLY
Wenn dieses Flag festgelegt ist, ist der Haltepunkt ein privater Haltepunkt. Dieser Haltepunkt ist nur für den Client sichtbar, der ihn hinzugefügt hat. In diesem Fall können andere Clients das Modul für den Haltepunkt nicht abfragen, und das Modul sendet keine vom Haltepunkt generierten Ereignisse an andere Clients. Alle Rückrufe (Ereignis und Ausgabe) im Zusammenhang mit diesem Haltepunkt werden nur an diesen Client gesendet. Siehe GetAdder.
DEBUG_BREAKPOINT_GO_ONLY
Wenn dieses Flag festgelegt ist, wird der Haltepunkt nur ausgelöst, wenn sich das Ziel in uneingeschränkter Ausführung befindet. Es wird nicht ausgelöst, wenn die Engine Anweisungen im Ziel durchläuft.
DEBUG_BREAKPOINT_ONE_SHOT
Wenn dieses Flag festgelegt ist, entfernt sich der Haltepunkt automatisch, wenn er zum ersten Mal ausgelöst wird.
DEBUG_BREAKPOINT_DEFERRED
Wenn dieses Flag festgelegt ist, wird der Haltepunkt zurückgestellt. Dieses Flag wird von der Engine festgelegt, wenn der Offset des Haltepunkts mithilfe eines symbolischen Ausdrucks angegeben wird und das Modul den Ausdruck nicht auswerten kann. Jedes Mal, wenn ein Modul im Ziel geladen oder entleitet wird, versucht die Engine, den Ausdruck für alle Haltepunkte neu zu bewerten, deren Position mithilfe eines Ausdrucks angegeben wird. Diejenigen, die nicht ausgewertet werden können, werden als verzögert gekennzeichnet. Dieses Flag kann von keinem Client geändert werden.
Andere Breakpointparameter
Breakpointparameter umfassen auch Folgendes:
Anzahl der Bestandenen
Wenn dem Haltepunkt eine Passanzahl zugeordnet ist, wird er erst aktiviert, wenn das Ziel den Haltepunkt in der angegebenen Anzahl überschritten hat. Die ursprünglich festgelegte Passanzahl kann mithilfe von GetPassCount ermittelt werden. Wie oft das Modul den Haltepunkt vor seiner Aktivierung übergibt, kann mithilfe von GetCurrentPassCount ermittelt werden. Die Passanzahl kann mithilfe von SetPassCount auf einen neuen Wert zurückgesetzt werden.
Thread übereinstimmen
Wenn dem Haltepunkt ein Thread zugeordnet ist, wird er von der Engine ignoriert, wenn er von einem anderen Thread gefunden wird. Der Thread kann mithilfe von GetMatchThreadId gefunden und mit SetMatchThreadId geändert werden.
Befehl
Dem Haltepunkt ist möglicherweise ein Befehl zugeordnet. Der Befehl wird ausgeführt, wenn der Haltepunkt aktiviert ist. Dieser Befehl kann mithilfe von GetCommand gefunden und mit SetCommand geändert werden.
Größe
Wenn der Haltepunkt ein Prozessor-Breakpoint ist, muss er eine angegebene Größe aufweisen. Dadurch wird die Größe des Speicherblocks bestimmt, dessen Zugriff den Haltepunkt aktiviert. Der Anfang des Blocks ist die Position des Haltepunkts. Die Größe kann mithilfe von GetDataParameters ermittelt und mithilfe von SetDataParameters geändert werden.
Zugriffstyp
Wenn der Haltepunkt ein Prozessor-Breakpoint ist, muss er über einen Zugriffstyp verfügen. Dadurch wird der Zugriffstyp bestimmt, der den Haltepunkt aktiviert. Beispielsweise kann der Haltepunkt aktiviert werden, wenn das Ziel den durch den Haltepunkt angegebenen Arbeitsspeicher liest, in diesen schreibt oder ausführt. Der Zugriffstyp kann mithilfe von GetDataParameters gefunden und mithilfe von SetDataParameters geändert werden.
Gültige Parameter für Prozessor breakpoints
Die folgenden Zugriffstypen sind für Prozessor-Breakpoints verfügbar:
Wert | BESCHREIBUNG |
---|---|
DEBUG_BREAK_READ |
Der Haltepunkt wird ausgelöst, wenn die CPU Arbeitsspeicher im Speicherblock des Haltepunkts liest. |
DEBUG_BREAK_WRITE |
Der Haltepunkt wird ausgelöst, wenn die CPU Arbeitsspeicher in den Speicherblock des Haltepunkts schreibt. |
DEBUG_BREAK_READ | DEBUG_BREAK_WRITE | Der Haltepunkt wird ausgelöst, wenn die CPU Arbeitsspeicher im Speicherblock des Haltepunkts liest oder schreibt. |
DEBUG_BREAK_EXECUTE |
Der Haltepunkt wird ausgelöst, wenn die CPU die Anweisung im Speicherblock des Haltepunkts abruft. |
DEBUG_BREAK_IO |
Der Haltepunkt wird ausgelöst, wenn auf den E/A-Port im Speicherblock der Haltepunkte zugegriffen wird. (Nur Windows XP und Microsoft Windows Server 2003, nur Kernelmodus, nur x86) |
Nicht alle Zugriffstypen und Größen werden auf allen Prozessoren unterstützt. Die folgenden Zugriffstypen und Größen werden unterstützt:
x86
Alle Zugriffstypen werden unterstützt. DEBUG_BREAK_READ verhält sich wie DEBUG_BREAK_READ | DEBUG_BREAK_WRITE. Die Größe muss 1, 2 oder 4 sein. Die Adresse des Haltepunkts muss ein Vielfaches der Größe aufweisen.
x64
Alle Zugriffstypen werden unterstützt. DEBUG_BREAK_READ verhält sich wie DEBUG_BREAK_READ | DEBUG_BREAK_WRITE. Die Größe muss 1, 2, 4 oder 8 sein. Die Adresse des Haltepunkts muss ein Vielfaches der Größe aufweisen.