Freigeben über


Binden von Haltepunkten

Wenn der Benutzer einen Haltepunkt festlegt, z. B. durch Drücken von F9, formuliert die IDE die Anforderung und fordert die Debugsitzung auf, den Haltepunkt zu erstellen.

Haltepunkt festlegen

Das Festlegen eines Haltepunkts ist ein zweistufiger Prozess, da der vom Haltepunkt betroffene Code oder die von dem Haltepunkt betroffenen Daten möglicherweise noch nicht verfügbar sind. Zuerst muss der Haltepunkt beschrieben werden, und dann muss er, da Code oder Daten verfügbar sind, wie folgt an diesen Code oder diese Daten gebunden werden:

  1. Der Haltepunkt wird von den relevanten Debugmodulen (DEs) angefordert, und dann wird der Haltepunkt an den Code oder die Daten gebunden, sobald er verfügbar wird.

  2. Die Haltepunktanforderung wird an die Debugsitzung gesendet, die sie an alle relevanten DEs sendet. Jede DE, die den Haltepunkt behandelt, erstellt einen entsprechenden ausstehenden Haltepunkt.

  3. Die Debugsitzung sammelt die ausstehenden Haltepunkte und sendet sie an das Debugpaket (die Debugkomponente von Visual Studio).

  4. Das Debugpaket fordert die Debugsitzung auf, den ausstehenden Haltepunkt an Code oder Daten zu binden. Die Debugsitzung sendet diese Anforderung an alle relevanten DEs.

  5. Wenn die DE den Haltepunkt binden kann, sendet er ein haltepunktgebundenes Ereignis an die Debugsitzung zurück. Wenn dies nicht der Fall ist, wird stattdessen ein Haltepunktfehlerereignis gesendet.

Ausstehende Haltepunkte

Ein ausstehender Haltepunkt kann an mehrere Codespeicherorte gebunden werden. Beispielsweise kann eine Quellcodezeile für eine C++-Vorlage an jede codesequenz gebunden werden, die aus der Vorlage generiert wird. Die Debugsitzung kann ein haltepunktgebundenes Ereignis verwenden, um die Codekontexte aufzulisten, die zu dem Zeitpunkt des Sendens des Ereignisses an einen Haltepunkt gebunden sind. Weitere Codekontexte können später gebunden werden, sodass die DE möglicherweise mehrere haltepunktgebundene Ereignisse für jede Bindungsanforderung sendet. Ein DE sollte jedoch nur ein Haltepunktfehlerereignis pro Bindungsanforderung senden.

Implementierung

Programmgesteuert ruft das Debugpaket den Sitzungsdebug-Manager (SDM) auf und gibt es eine IDebugBreakpointRequest2-Schnittstelle , die eine BP_REQUEST_INFO Struktur umschließt, die den festzulegenden Haltepunkt beschreibt. Obwohl Haltepunkte von vielen Formen sein können, lösen sie sich letztendlich in einen Code- oder Datenkontext auf.

Der SDM übergibt diesen Aufruf an jede relevante DE, indem die CreatePendingBreakpoint-Methode aufgerufen wird. Wenn die DE den Haltepunkt behandelt, wird eine IDebugPendingBreakpoint2-Schnittstelle erstellt und zurückgegeben. Die SDM sammelt diese Schnittstellen und übergibt sie als einzelne IDebugPendingBreakpoint2 Schnittstelle an das Debugpaket zurück.

Bisher wurden keine Ereignisse generiert.

Das Debugpaket versucht dann, den ausstehenden Haltepunkt durch Aufrufen von Bind, das von der DE implementiert wird, an Code oder Daten zu binden.

Wenn der Haltepunkt gebunden ist, sendet die DE eine IDebugBreakpointBoundEvent2-Ereignisschnittstelle an das Debugpaket. Das Debugpaket verwendet diese Schnittstelle, um alle Codekontexte (oder den einzelnen Datenkontext) aufzulisten, die an den Haltepunkt gebunden sind, indem EnumBoundBreakpoints aufgerufen wird, die eine oder mehrere IDebugBoundBreakpoint2-Schnittstellen zurückgibt. Die GetBreakpointResolution-Schnittstelle gibt eine IDebugBreakpointResolution2-Schnittstelle zurück, und GetResolutionInfo gibt eine BP_RESOLUTION_INFO Union zurück, die den Code oder den Datenkontext enthält.

Wenn die DE den Haltepunkt nicht binden kann, sendet sie eine einzelne IDebugBreakpointErrorEvent2-Ereignisschnittstelle an das Debugpaket. Das Debugpaket ruft den Fehlertyp (Fehler oder Warnung) und die Informationsmeldung ab, indem GetErrorBreakpoint aufgerufen wird, gefolgt von GetBreakpointResolution und GetResolutionInfo. Dadurch wird eine BP_ERROR_RESOLUTION_INFO Struktur zurückgegeben, die den Fehlertyp und die Meldung enthält.

Wenn ein DE einen Haltepunkt behandelt, aber nicht binden kann, wird ein Fehler vom Typ zurückgegeben BPET_TYPE_ERROR. Das Debugpaket antwortet, indem ein Fehlerdialogfeld angezeigt wird, und die IDE platziert ein Ausrufezeichen in der Haltepunktglyphe links neben der Quellcodezeile.

Wenn ein DE einen Haltepunkt behandelt, kann ihn nicht binden, aber ein anderer DE kann ihn binden, wird eine Warnung zurückgegeben. Die IDE antwortet, indem eine Frageglyphe in der Haltepunktglyphe links neben der Quellcodezeile platziert wird.