Compartir a través de


Enlazar puntos de interrupción

Si el usuario establece un punto de interrupción, quizás presionando F9, el IDE formula la solicitud y solicita la sesión de depuración para crear el punto de interrupción.

Establecer un punto de interrupción

Establecer un punto de interrupción es un proceso de dos pasos, ya que es posible que el código o los datos afectados por el punto de interrupción aún no estén disponibles. En primer lugar, el punto de interrupción debe describirse y, a continuación, a medida que el código o los datos estén disponibles, debe estar enlazado a ese código o datos, como se indica a continuación:

  1. El punto de interrupción se solicita desde los motores de depuración (DE) pertinentes y, a continuación, el punto de interrupción está enlazado al código o a los datos a medida que esté disponible.

  2. La solicitud de punto de interrupción se envía a la sesión de depuración, que la envía a todos los DE pertinentes. Cualquier DE que elija controlar el punto de interrupción crea un punto de interrupción pendiente correspondiente.

  3. La sesión de depuración recopila los puntos de interrupción pendientes y los devuelve al paquete de depuración (el componente de depuración de Visual Studio).

  4. El paquete de depuración solicita a la sesión de depuración que enlace el punto de interrupción pendiente a código o datos. La sesión de depuración envía esta solicitud a todos los DEs pertinentes.

  5. Si el DE puede enlazar el punto de interrupción, envía un evento enlazado a un punto de interrupción a la sesión de depuración. Si no es así, envía un evento de error de punto de interrupción en su lugar.

Puntos de interrupción pendientes

Un punto de interrupción pendiente puede enlazarse a varias ubicaciones de código. Por ejemplo, una línea de código fuente para una plantilla de C++ puede enlazarse a cada secuencia de código generada a partir de la plantilla. La sesión de depuración puede usar un evento enlazado a un punto de interrupción para enumerar los contextos de código enlazados a un punto de interrupción en el momento en que se envió el evento. Más contextos de código se pueden enlazar más adelante, por lo que el DE puede enviar varios eventos enlazados a puntos de interrupción para cada solicitud de enlace. Sin embargo, un DE debe enviar solo un evento de error de punto de interrupción por solicitud de enlace.

Implementación

Mediante programación, el paquete de depuración llama al administrador de depuración de sesión (SDM) y le proporciona una interfaz IDebugBreakpointRequest2 que encapsula una estructura BP_REQUEST_INFO , que describe el punto de interrupción que se va a establecer. Aunque los puntos de interrupción pueden ser de muchas formas, en última instancia se resuelven en un código o contexto de datos.

El SDM pasa esta llamada a cada DE pertinente llamando a su método CreatePendingBreakpoint . Si el DE elige controlar el punto de interrupción, crea y devuelve una interfaz IDebugPendingBreakpoint2 . SdM recopila estas interfaces y las pasa de nuevo al paquete de depuración como una sola IDebugPendingBreakpoint2 interfaz.

Hasta ahora, no se han generado eventos.

A continuación, el paquete de depuración intenta enlazar el punto de interrupción pendiente al código o a los datos mediante una llamada a Bind, que implementa el DE.

Si el punto de interrupción está enlazado, el DE envía una interfaz de evento IDebugBreakpointBoundEvent2 al paquete de depuración. El paquete de depuración usa esta interfaz para enumerar todos los contextos de código (o el único contexto de datos) enlazado al punto de interrupción llamando a EnumBoundBreakpoints, que devuelve una o varias interfaces IDebugBoundBreakpoint2 . La interfaz GetBreakpointResolution devuelve una interfaz IDebugBreakpointResolution2 y GetResolutionInfo devuelve una unión BP_RESOLUTION_INFO que contiene el código o el contexto de datos.

Si el DE no puede enlazar el punto de interrupción, envía una única interfaz de eventos IDebugBreakpointErrorEvent2 al paquete de depuración. El paquete de depuración recupera el tipo de error (error o advertencia) y el mensaje informativo llamando a GetErrorBreakpoint, seguido de GetBreakpointResolution y GetResolutionInfo. Esto devuelve una estructura BP_ERROR_RESOLUTION_INFO que contiene el tipo de error y el mensaje.

Si un DE controla un punto de interrupción pero no puede enlazarlo, devuelve un error de tipo BPET_TYPE_ERROR. El paquete de depuración responde mostrando un cuadro de diálogo de error y el IDE coloca un glifo de exclamación dentro del glifo de punto de interrupción a la izquierda de la línea de código fuente.

Si un DE controla un punto de interrupción, no puede enlazarlo, pero otro DE podría enlazarlo, devuelve una advertencia. El IDE responde colocando un glifo de pregunta dentro del glifo de punto de interrupción a la izquierda de la línea de código fuente.