Pontos de interrupção de ligação
Se o usuário define um ponto de interrupção, talvez, pressionando F9, o IDE Formula a solicitação e solicita que a sessão de depuração para criar o ponto de interrupção.
Definindo um ponto de interrupção.
Definindo um ponto de interrupção é um processo de duas etapas, porque o código ou dados afetados por um ponto de interrupção talvez ainda não estejam disponíveis. Primeiro, o ponto de interrupção deve ser descrito e em seguida, como código ou dados se torna disponíveis, ele deve ser vinculado a esse código ou dados, da seguinte maneira:
O ponto de interrupção é solicitado os mecanismos de depuração relevantes (DEs) e, em seguida, o ponto de interrupção é vinculado ao código ou dados assim que estiver disponível.
A solicitação do ponto de interrupção é enviada para a sessão de depuração, envia a todos os DEs relevantes. Qualquer que escolhe para lidar com o ponto de interrupção DE cria um correspondente pendentes do ponto de interrupção.
A sessão de depuração coleta de pontos de interrupção pendentes e os envia o pacote de depuração (o componente de depuração do Visual Studio).
O pacote de depuração solicita que a sessão de depuração para vincular o ponto de interrupção pendente no código ou dados. A sessão de depuração envia essa solicitação para todos os DEs relevantes.
Se o DE é capaz de vincular o ponto de interrupção, ele envia que um ponto de interrupção vinculado o evento volta para a sessão de depuração. Caso contrário, ele envia um evento de erro de ponto de interrupção em vez disso.
Pontos de interrupção pendentes
Um ponto de interrupção pendente pode vincular a vários locais de código. Por exemplo, uma linha de código-fonte para um modelo de C++ pode vincular a cada seqüência de código gerada a partir do modelo. A sessão de depuração pode usar um evento acoplado do ponto de interrupção para enumerar os contextos de código vinculados a um ponto de interrupção no momento em que o evento foi enviado. Mais contextos de código podem ser vinculados posteriormente, para que o DE pode enviar acoplado de ponto de interrupção de vários eventos para cada solicitação de ligação. No entanto, um DE deve enviar apenas um evento de erro de ponto de interrupção por solicitação do bind.
Implementação
Programaticamente, o pacote de depuração chama a depuração de sessão manager (SDM) e concede a ele um IDebugBreakpointRequest2 interface que encapsula um BP_REQUEST_INFO estrutura, que descreve o ponto de interrupção a ser definido. Embora os pontos de interrupção podem ser de muitas formas, elas finalmente resolverem para um contexto de código ou dados.
O SDM passa esta chamada para cada relevante DE chamando seu IDebugEngine2::CreatePendingBreakpoint método. Se escolher o DE lidar com o ponto de interrupção, ele cria e retorna um IDebugPendingBreakpoint2 interface. O SDM essas interfaces de coleta e transmite-as de volta para o pacote de depuração como um único IDebugPendingBreakpoint2 interface.
Até agora, nenhum evento foi gerado.
O pacote de depuração, em seguida, tenta vincular o ponto de interrupção pendente no código ou dados chamando IDebugPendingBreakpoint2::Bind, que é implementada por DE.
Se o ponto de interrupção é vinculado, o DE envia um IDebugBreakpointBoundEvent2 interface de eventos para o pacote de depuração. Os usos do pacote de depuração esta interface para enumerar todos os contextos de código (ou o contexto de dados único) acoplado no ponto de interrupção, chamando IDebugBreakpointBoundEvent2::EnumBoundBreakpoints, que retorna um ou mais IDebugBoundBreakpoint2 interfaces. O IDebugBoundBreakpoint2::GetBreakpointResolution interface retorna um IDebugBreakpointResolution2 interface, e IDebugBreakpointResolution2::GetResolutionInfo retorna um BP_RESOLUTION_INFO que contém o contexto de dados ou códigos de união.
Se o DE não conseguir ligar o ponto de interrupção, ele envia um único IDebugBreakpointErrorEvent2 interface de eventos para o pacote de depuração. O pacote de depuração recupera o tipo de erro (erro ou aviso) e uma mensagem informativa chamando IDebugBreakpointErrorEvent2::GetErrorBreakpoint, em seguida, IDebugErrorBreakpoint2::GetBreakpointResolution e IDebugErrorBreakpointResolution2::GetResolutionInfo. Isso retorna um BP_ERROR_RESOLUTION_INFO estrutura que contém o tipo de erro e a mensagem.
Se um DE lida com um ponto de interrupção, mas não é possível vinculá-lo, ele retorna um erro do tipo BPET_TYPE_ERROR. O pacote de debug responde exibindo uma caixa de diálogo de erro e o IDE coloca um glifo de exclamação dentro o glifo de ponto de interrupção à esquerda da linha de código de origem.
Se um DE lida com um ponto de interrupção, não é possível vincular a ele, mas alguma outra DE pode acoplá-lo, ele retorna um aviso. O IDE responde colocando um glifo pergunta dentro o glifo de ponto de interrupção à esquerda da linha de código de origem.