Привязка точек останова

Если пользователь задает точку останова, возможно, нажав клавишу F9, интегрированная среда разработки сформулирует запрос и предложит сеансу отладки создать точку останова.

Установка точки останова

Установка точки останова — это двухэтапный процесс, так как код или данные, затронутые точкой останова, пока не доступны. Сначала необходимо описать точку останова, а затем, как код или данные становятся доступными, она должна быть привязана к этому коду или данным, как показано ниже.

  1. Точка останова запрашивается от соответствующих подсистем отладки (DEs), а затем точка останова привязана к коду или данным по мере его доступности.

  2. Запрос точки останова отправляется в сеанс отладки, который отправляет его всем соответствующим DEs. Любой de, который выбирает обработку точки останова, создает соответствующую ожидающую точку останова.

  3. Сеанс отладки собирает ожидающие точки останова и отправляет их обратно в пакет отладки (компонент отладки Visual Studio).

  4. Пакет отладки запрашивает сеанс отладки для привязки ожидающей точки останова к коду или данным. Сеанс отладки отправляет этот запрос всем соответствующим DES.

  5. Если DE может привязать точку останова, она отправляет связанное событие точки останова обратно в сеанс отладки. В противном случае он отправляет событие ошибки точки останова.

Ожидающие точки останова

Ожидающая точка останова может привязаться к нескольким расположениям кода. Например, строка исходного кода для шаблона C++ может привязаться к каждой последовательности кода, созданной на основе шаблона. Сеанс отладки может использовать связанное событие точки останова для перечисления контекстов кода, привязанных к точке останова во время отправки события. Дополнительные контексты кода можно привязать позже, поэтому DE может отправлять несколько событий привязки точки останова для каждого запроса привязки. Однако de de должен отправлять только одно событие ошибки точки останова для каждого запроса привязки.

Внедрение

Программным образом пакет отладки вызывает диспетчер отладки сеанса (SDM) и предоставляет ему интерфейс IDebugBreakpointRequest2 , который упаковывает структуру BP_REQUEST_INFO , которая описывает точку останова, которую необходимо задать. Хотя точки останова могут иметь множество форм, они в конечном итоге разрешаются в контексте кода или данных.

SDM передает этот вызов каждому соответствующему DE путем вызова метода CreatePendingBreakpoint . Если DE выбирает обработку точки останова, он создает и возвращает интерфейс IDebugPendingBreakpoint2 . SDM собирает эти интерфейсы и передает их обратно в пакет отладки в виде одного IDebugPendingBreakpoint2 интерфейса.

До сих пор никаких событий не было создано.

Затем пакет отладки пытается привязать ожидающую точку останова к коду или данным путем вызова Bind, который реализуется DE.

Если точка останова привязана, de отправляет интерфейс события IDebugBreakpointBoundEvent2 в пакет отладки. Пакет отладки использует этот интерфейс для перечисления всех контекстов кода (или одного контекста данных), привязанных к точке останова путем вызова EnumBoundBreakpoints, который возвращает один или несколько интерфейсов IDebugBoundBreakpoint2 . Интерфейс GetBreakpointResolution возвращает интерфейс IDebugBreakpointResolution2, а GetResolutionInfo возвращает BP_RESOLUTION_INFO объединение, содержащее код или контекст данных.

Если DE не удается привязать точку останова, он отправляет один интерфейс события IDebugBreakpointErrorEvent2 в пакет отладки. Пакет отладки извлекает тип ошибки (ошибка или предупреждение) и информационное сообщение путем вызова GetErrorBreakpoint, а затем GetBreakpointResolution и GetResolutionInfo. Возвращает BP_ERROR_RESOLUTION_INFO структуру, содержащую тип ошибки и сообщение.

Если de обрабатывает точку останова, но не может привязать ее, возвращает ошибку типа BPET_TYPE_ERROR. Пакет отладки отвечает, отображая диалоговое окно ошибки, и интегрированная среда разработки помещает восклицательный глиф внутри глифа точки останова слева от строки исходного кода.

Если de обрабатывает точку останова, не удается привязать ее, но некоторые другие de могут привязать его, он возвращает предупреждение. Интегрированная среда разработки отвечает путем размещения глифа вопроса внутри глифа точки останова слева от строки исходного кода.