Controlando sinalizadores e parâmetros de ponto de interrupção

Há vários métodos que podem ser usados para determinar informações básicas sobre pontos de interrupção:

  • GetId retorna a ID do ponto de interrupção.

  • GetType retorna o tipo de ponto de interrupção (software ou processador) e o tipo do processador efetivo no qual o ponto de interrupção está definido.

  • GetAdder retorna o cliente que adicionou o ponto de interrupção.

  • GetOffset retorna o endereço de um ponto de interrupção.

  • GetOffsetExpression retorna a cadeia de caracteres de expressão que especifica o local do ponto de interrupção.

Além de sua localização e tipo de ponto de interrupção, um ponto de interrupção tem vários parâmetros que controlam seu comportamento.

Os parâmetros de ponto de interrupção podem ser controlados por meio de uma variedade de métodos específicos. Além disso, a maioria dos parâmetros pode ser consultada em conjunto usando GetParameters.

Sinalizadores de ponto de interrupção

Sinalizadores de ponto de interrupção são um tipo de parâmetros de ponto de interrupção.

Sinalizadores de ponto de interrupção podem ser consultados usando GetFlags. Eles podem ser alterados usando AddFlags, RemoveFlags ou SetFlags.

Sinalizadores de ponto de interrupção formam um campo de bits. Os possíveis sinalizadores que podem ser usados neste campo de bits e seus significados são os seguintes:

DEBUG_BREAKPOINT_ENABLED
Quando esse sinalizador é definido, o ponto de interrupção é habilitado e terá seu efeito normal. Quando esse sinalizador não estiver definido, o ponto de interrupção será desabilitado e não terá nenhum efeito. Se você quiser desativar temporariamente um ponto de interrupção, poderá remover esse sinalizador; Em seguida, é fácil adicionar esse sinalizador de volta quando você deseja reabilitar esse ponto de interrupção.

DEBUG_BREAKPOINT_ADDER_ONLY
Quando esse sinalizador é definido, o ponto de interrupção é um ponto de interrupção privado. Esse ponto de interrupção é visível apenas para o cliente que o adicionou. Nesse caso, outros clientes não poderão consultar o mecanismo para o ponto de interrupção e o mecanismo não enviará eventos gerados pelo ponto de interrupção para outros clientes. Todos os retornos de chamada (evento e saída) relacionados a esse ponto de interrupção serão enviados somente para esse cliente. Consulte GetAdder.

DEBUG_BREAKPOINT_GO_ONLY
Quando esse sinalizador for definido, o ponto de interrupção só será disparado se o destino estiver em execução irrestrita. Ele não será disparado se o mecanismo estiver percorrendo as instruções no destino.

DEBUG_BREAKPOINT_ONE_SHOT
Quando esse sinalizador for definido, o ponto de interrupção se removerá automaticamente na primeira vez que for disparado.

DEBUG_BREAKPOINT_DEFERRED
Quando esse sinalizador é definido, o ponto de interrupção é adiado. Esse sinalizador é definido pelo mecanismo quando o deslocamento do ponto de interrupção é especificado usando uma expressão simbólica e o mecanismo não pode avaliar a expressão. Sempre que um módulo for carregado ou sem inserção no destino, o mecanismo tentará reavaliar a expressão para todos os pontos de interrupção cujo local é especificado usando uma expressão. Aqueles que não podem ser avaliados são sinalizados como adiados. Esse sinalizador não pode ser modificado por nenhum cliente.

Outros parâmetros de ponto de interrupção

Os parâmetros de ponto de interrupção também incluem:

Contagem de aprovação
Se o ponto de interrupção tiver uma contagem de aprovação associada a ele, ele não será ativado até que o destino tenha passado o ponto de interrupção o número especificado de vezes. A contagem de aprovações que foi originalmente definida pode ser encontrada usando GetPassCount. O número de vezes restante que o mecanismo passará pelo ponto de interrupção antes de ser ativado pode ser encontrado usando GetCurrentPassCount. A contagem de aprovação pode ser redefinida para um novo valor usando SetPassCount.

Corresponder thread
Se o ponto de interrupção tiver um thread associado a ele, ele será ignorado pelo mecanismo quando for encontrado por qualquer outro thread. O thread pode ser encontrado usando GetMatchThreadId e pode ser alterado usando SetMatchThreadId.

Comando
O ponto de interrupção pode ter um comando associado a ele. O comando é executado quando o ponto de interrupção é ativado. Esse comando pode ser encontrado usando GetCommand e pode ser alterado usando SetCommand.

Tamanho
Se o ponto de interrupção for um ponto de interrupção do processador, ele deverá ter um tamanho especificado. Isso determina o tamanho do bloco de memória cujo acesso ativará o ponto de interrupção – o início do bloco é o local do ponto de interrupção. O tamanho pode ser encontrado usando GetDataParameters e pode ser alterado usando SetDataParameters.

Tipo de acesso
Se o ponto de interrupção for um ponto de interrupção do processador, ele deverá ter um tipo de acesso. Isso determina o tipo de acesso que ativará o ponto de interrupção. Por exemplo, o ponto de interrupção poderá ser ativado se o destino ler, gravar ou executar a memória especificada pelo ponto de interrupção. O tipo de acesso pode ser encontrado usando GetDataParameters e pode ser alterado usando SetDataParameters.

Parâmetros válidos para pontos de interrupção do processador

Os seguintes tipos de acesso estão disponíveis para pontos de interrupção do processador:

Valor Descrição

DEBUG_BREAK_READ

O ponto de interrupção será disparado quando a CPU ler a memória no bloco de memória do ponto de interrupção.

DEBUG_BREAK_WRITE

O ponto de interrupção será disparado quando a CPU gravar memória no bloco de memória do ponto de interrupção.

DEBUG_BREAK_READ | DEBUG_BREAK_WRITE

O ponto de interrupção será disparado quando a CPU ler ou gravar memória no bloco de memória do ponto de interrupção.

DEBUG_BREAK_EXECUTE

O ponto de interrupção será disparado quando a CPU buscar a instrução no bloco de memória do ponto de interrupção.

DEBUG_BREAK_IO

O ponto de interrupção será disparado quando a porta de E/S no bloco de memória de pontos de interrupção for acessada. (Somente Windows XP e Microsoft Windows Server 2003, somente modo kernel, somente x86)

Nem todos os tipos e tamanhos de acesso têm suporte em todos os processadores. Há suporte para os seguintes tipos de acesso e tamanhos:

x86
Há suporte para todos os tipos de acesso. DEBUG_BREAK_READ se comporta como DEBUG_BREAK_READ | DEBUG_BREAK_WRITE. O tamanho deve ser 1, 2 ou 4. O endereço do ponto de interrupção deve ser um múltiplo do tamanho.

x64
Há suporte para todos os tipos de acesso. DEBUG_BREAK_READ se comporta como DEBUG_BREAK_READ | DEBUG_BREAK_WRITE. O tamanho deve ser 1, 2, 4 ou 8. O endereço do ponto de interrupção deve ser um múltiplo do tamanho.