Partilhar via


Controlo da execução

O mecanismo de depuração (DE) normalmente envia um dos seguintes eventos como o último evento de inicialização:

  • O evento de ponto de entrada, se associado a um programa recém-iniciado

  • O evento de conclusão de carregamento, se estiver anexado a um programa que já está em execução

    Ambos os eventos são eventos de parada, o que significa que o DE aguarda uma resposta do usuário por meio do IDE. Para obter mais informações, consulte Modos operacionais.

Evento de interrupção

Quando um evento de parada é enviado para a sessão de depuração:

  1. O programa e o thread que contêm o ponteiro de instrução atual podem ser obtidos na interface do evento.

  2. O IDE determina o arquivo de código-fonte atual e a posição, que ele exibe como destacado no editor.

  3. A sessão de depuração normalmente responde a esse primeiro evento de parada chamando o método Continue do programa.

  4. Em seguida, o programa é executado até encontrar uma condição de parada, como atingir um ponto de interrupção. Nesse caso, o DE envia um evento de ponto de interrupção para a sessão de depuração. O evento de ponto de interrupção é um evento de parada e o DE novamente aguarda uma resposta do usuário.

  5. Se o utilizador optar por entrar, passar por cima ou sair de uma função, a IDE instrui a sessão de depuração a chamar o método do programa Step. Em seguida, a IDE passa a unidade de etapa (comando, instrução ou linha) e o tipo de etapa (se deve entrar em, passar por cima de ou sair da função). Quando a etapa é concluída, o DE envia um evento de conclusão de etapa para a sessão de depuração, que é um evento de interrupção.

    -ou-

    Se o usuário optar por continuar a execução a partir do ponteiro de instrução atual, o IDE solicitará que a sessão de depuração chame o método Execute do programa. O programa retoma a execução até encontrar a próxima condição de paragem.

    -ou-

    Se a sessão de depuração for ignorar um evento de parada específico, a sessão de depuração chamará o método Continue do programa. Se o programa estava entrando, passando por cima de ou saindo de uma função quando encontrou a condição de paragem, ele continua a execução do passo.

    Programaticamente, quando o DE encontra uma condição de parada, ele envia eventos de parada como IDebugLoadCompleteEvent2 ou IDebugEntryPointEvent2 para o gerenciador de depuração de sessão (SDM) por meio de uma interface IDebugEventCallback2 . O DE passa as interfaces IDebugProgram2 e IDebugThread2 que representam o programa e o thread que contém o ponteiro de instrução atual. O SDM chama IDebugThread2::EnumFrameInfo para obter o quadro de pilha superior e chama IDebugStackFrame2::GetDocumentContext para obter o contexto do documento associado ao ponteiro de instrução atual. Este contexto de documento é normalmente um nome de arquivo de código-fonte, linha e número de coluna. O IDE os usa para destacar o código-fonte que contém o ponteiro de instrução atual.

    O SDM normalmente responde a esse primeiro evento de parada chamando IDebugProgram2::Continue. Em seguida, o programa é executado até encontrar uma condição de paragem, como atingir um ponto de paragem, caso em que o DE envia a interface IDebugBreakpointEvent2 para o SDM. O evento de interrupção é um evento de paragem e o DE novamente aguarda uma resposta do utilizador.

    Se o utilizador optar por entrar, passar por cima ou sair de uma função, o IDE solicitará que o SDM chame IDebugProgram2::Step. Em seguida, o IDE passa o STEPUNIT (instrução, declaração ou linha) e o STEPKIND, ou seja, se deve entrar, passar por ou sair da função. Quando a etapa é concluída, o DE envia uma interface IDebugStepCompleteEvent2 para o SDM, que é um evento de parada.

    Se o utilizador optar por continuar a execução a partir do ponteiro de instrução atual, o IDE solicitará ao SDM para chamar IDebugProgram2::Execute. O programa retoma a execução até encontrar a próxima condição de paragem.

    Se o pacote de depuração for ignorar um evento de parada específico, o pacote de depuração chamará o SDM, que chama IDebugProgram2::Continue. Se o programa estava entrando, passando ou saindo de uma função quando encontrou a condição de parada, ele continua a etapa. Isto implica que o programa mantenha um estado de execução passo a passo, para que saiba como continuar.

    As chamadas que o SDM faz para Step, Executar e Continuar são assíncronas, o que significa que o SDM espera que a chamada retorne rapidamente. Se o DE enviar ao SDM um evento de parada no mesmo thread antes de Stepretornar, Executar ou Continuar, o SDM deixa de responder.