Powiązywanie punktów przerwania

Jeśli użytkownik ustawia punkt przerwania, na przykład przez naciśnięcie klawisza F9, środowisko IDE formułuje żądanie i monituje sesję debugowania o utworzenie punktu przerwania.

Ustawianie punktu przerwania

Ustawienie punktu przerwania jest procesem dwuetapowym, ponieważ kod lub dane, na które ma wpływ punkt przerwania, mogą nie być jeszcze dostępne. Najpierw należy opisać punkt przerwania, a następnie, gdy kod lub dane staną się dostępne, musi być powiązany z tym kodem lub danymi w następujący sposób:

  1. Punkt przerwania jest żądany z odpowiednich aparatów debugowania (DE), a następnie punkt przerwania jest powiązany z kodem lub danymi, gdy stanie się dostępny.

  2. Żądanie punktu przerwania jest wysyłane do sesji debugowania, która wysyła je do wszystkich odpowiednich kontrolerów sieciowych. Każda de, która wybierze obsługę punktu przerwania, tworzy odpowiadający oczekujący punkt przerwania.

  3. Sesja debugowania zbiera oczekujące punkty przerwania i wysyła je z powrotem do pakietu debugowania (składnik debugowania programu Visual Studio).

  4. Pakiet debugowania monituje sesję debugowania, aby powiązać oczekujący punkt przerwania z kodem lub danymi. Sesja debugowania wysyła to żądanie do wszystkich odpowiednich środowisk DE.

  5. Jeśli de jest w stanie powiązać punkt przerwania, wysyła zdarzenie powiązane z punktem przerwania z powrotem do sesji debugowania. W przeciwnym razie wysyła zdarzenie błędu punktu przerwania.

Oczekujące punkty przerwania

Oczekujący punkt przerwania może wiązać się z wieloma lokalizacjami kodu. Na przykład wiersz kodu źródłowego szablonu języka C++ może być powiązany z każdą sekwencją kodu wygenerowaną na podstawie szablonu. Sesja debugowania może użyć zdarzenia powiązanego z punktem przerwania, aby wyliczyć konteksty kodu powiązane z punktem przerwania w momencie wysłania zdarzenia. Więcej kontekstów kodu można powiązać później, więc de może wysyłać wiele zdarzeń powiązanych z punktem przerwania dla każdego żądania powiązania. Jednak de powinien wysyłać tylko jedno zdarzenie błędu punktu przerwania na żądanie powiązania.

Implementacja

Programowo pakiet debugowania wywołuje menedżera debugowania sesji (SDM) i udostępnia mu interfejs IDebugBreakpointRequest2 , który opakowuje strukturę BP_REQUEST_INFO , która opisuje punkt przerwania do ustawienia. Chociaż punkty przerwania mogą mieć wiele form, ostatecznie są rozpoznawane jako kod lub kontekst danych.

SdM przekazuje to wywołanie do każdego odpowiedniego de, wywołując metodę CreatePendingBreakpoint . Jeśli de wybierze obsługę punktu przerwania, tworzy i zwraca interfejs IDebugPendingBreakpoint2 . SdM zbiera te interfejsy i przekazuje je z powrotem do pakietu debugowania jako pojedynczy IDebugPendingBreakpoint2 interfejs.

Do tej pory nie wygenerowano żadnych zdarzeń.

Następnie pakiet debugowania próbuje powiązać oczekujący punkt przerwania z kodem lub danymi, wywołując metodę Bind, która jest implementowana przez de.

Jeśli punkt przerwania jest powiązany, de wysyła interfejs zdarzeń IDebugBreakpointBoundEvent2 do pakietu debugowania. Pakiet debugowania używa tego interfejsu do wyliczania wszystkich kontekstów kodu (lub pojedynczego kontekstu danych) powiązanego z punktem przerwania przez wywołanie enumBoundBreakpoints, co zwraca co najmniej jeden interfejs IDebugBoundBreakpoint2 . Interfejs GetBreakpointResolution zwraca interfejs IDebugBreakpointResolution2 , a polecenie GetResolutionInfo zwraca union BP_RESOLUTION_INFO zawierający kod lub kontekst danych.

Jeśli de nie może powiązać punktu przerwania, wysyła jeden interfejs zdarzeń IDebugBreakpointErrorEvent2 do pakietu debugowania. Pakiet debugowania pobiera typ błędu (błąd lub ostrzeżenie) i komunikat informacyjny, wywołując polecenie GetErrorBreakpoint, a następnie GetBreakpointResolution i GetResolutionInfo. Spowoduje to zwrócenie struktury BP_ERROR_RESOLUTION_INFO zawierającej typ błędu i komunikat.

Jeśli de obsługuje punkt przerwania, ale nie może go powiązać, zwraca błąd typu BPET_TYPE_ERROR. Pakiet debugowania odpowiada, wyświetlając okno dialogowe błędu, a środowisko IDE umieszcza wykrzyknik wewnątrz glif punktu przerwania po lewej stronie wiersza kodu źródłowego.

Jeśli de obsługuje punkt przerwania, nie może go powiązać, ale niektóre inne DE mogą je powiązać, zwraca ostrzeżenie. Środowisko IDE odpowiada, umieszczając glyph pytania w glyph punktu przerwania po lewej stronie wiersza kodu źródłowego.