Compartilhar via


Vincular pontos de interrupção

Se o usuário definir um ponto de interrupção, talvez pressionando F9, o IDE formulará a solicitação e solicitará que a sessão de depuração crie o ponto de interrupção.

Definir um ponto de interrupção

A definição de um ponto de interrupção é um processo de duas etapas, pois o código ou os dados afetados pelo ponto de interrupção podem ainda não estar disponíveis. Primeiro, o ponto de interrupção deve ser descrito e, em seguida, à medida que o código ou os dados se tornam disponíveis, ele deve ser vinculado a esse código ou dados, da seguinte maneira:

  1. O ponto de interrupção é solicitado dos mecanismos de depuração (DEs) relevantes e, em seguida, o ponto de interrupção é vinculado ao código ou aos dados à medida que se tornam disponíveis.

  2. A solicitação de ponto de interrupção é enviada para a sessão de depuração, que a envia para todas as DEs relevantes. Qualquer DE que opte por manipular o ponto de interrupção cria um ponto de interrupção pendente correspondente.

  3. A sessão de depuração coleta os pontos de interrupção pendentes e os envia de volta para o pacote de depuração (o componente de depuração do Visual Studio).

  4. O pacote de depuração solicita que a sessão de depuração vincule o ponto de interrupção pendente ao código ou aos dados. A sessão de depuração envia essa solicitação para todas as DEs relevantes.

  5. Se o DE for capaz de vincular o ponto de interrupção, ele enviará um evento associado ao ponto de interrupção de volta para a sessão de depuração. Caso contrário, ele envia um evento de erro de ponto de interrupção.

Pontos de interrupção pendentes

Um ponto de interrupção pendente pode se vincular a vários locais de código. Por exemplo, uma linha de código-fonte para um modelo C++ pode se vincular a cada sequência de código gerada a partir do modelo. A sessão de depuração pode usar um evento associado a 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 possa enviar vários eventos vinculados a ponto de interrupção para cada solicitação de associação. No entanto, um DE deve enviar apenas um evento de erro de ponto de interrupção por solicitação de ligação.

Implementação

Programaticamente, o pacote de depuração chama o gerenciador de depuração de sessão (SDM) e fornece a ele uma interface IDebugBreakpointRequest2 que encapsula uma estrutura BP_REQUEST_INFO, que descreve o ponto de interrupção a ser definido. Embora os pontos de interrupção possam ser de muitas formas, eles acabam sendo resolvidos para um contexto de código ou dados.

O SDM passa essa chamada para cada DE relevante chamando seu método CreatePendingBreakpoint . Se o DE optar por manipular o ponto de interrupção, ele criará e retornará uma interface IDebugPendingBreakpoint2 . O SDM coleta essas interfaces e as passa de volta para o pacote de depuração como uma única IDebugPendingBreakpoint2 interface.

Até agora, nenhum evento foi gerado.

Em seguida, o pacote de depuração tenta vincular o ponto de interrupção pendente ao código ou aos dados chamando Bind, que é implementado pelo DE.

Se o ponto de interrupção estiver vinculado, o DE enviará uma interface de evento IDebugBreakpointBoundEvent2 para o pacote de depuração. O pacote de depuração usa essa interface para enumerar todos os contextos de código (ou o contexto de dados único) vinculados ao ponto de interrupção chamando EnumBoundBreakpoints, que retorna uma ou mais interfaces IDebugBoundBreakpoint2 . A interface GetBreakpointResolution retorna uma interface IDebugBreakpointResolution2 e GetResolutionInfo retorna uma união BP_RESOLUTION_INFO que contém o código ou o contexto de dados.

Se o DE não conseguir vincular o ponto de interrupção, ele enviará uma única interface de evento IDebugBreakpointErrorEvent2 para o pacote de depuração. O pacote de depuração recupera o tipo de erro (erro ou aviso) e a mensagem informativa chamando GetErrorBreakpoint, seguido por GetBreakpointResolution e GetResolutionInfo. Isso retorna uma estrutura BP_ERROR_RESOLUTION_INFO que contém o tipo de erro e a mensagem.

Se um DE manipula um ponto de interrupção, mas não pode vinculá-lo, ele retorna um erro do tipo BPET_TYPE_ERROR. O pacote de depuração responde exibindo uma caixa de diálogo de erro e o IDE coloca um glifo de exclamação dentro do glifo do ponto de interrupção à esquerda da linha do código-fonte.

Se um DE manipula um ponto de interrupção, não pode vinculá-lo, mas algum outro DE pode vinculá-lo, ele retorna um aviso. O IDE responde colocando um glifo de pergunta dentro do glifo do ponto de interrupção à esquerda da linha do código-fonte.