Share via


Executando até que um estado especificado seja atingido

Há várias maneiras de fazer com que o destino seja executado até que um estado especificado seja atingido.

Usando um ponto de interrupção para controlar a execução

Um método é usar um ponto de interrupção. O ponto de interrupção mais simples interrompe a execução quando o contador do programa atinge um endereço especificado. Um ponto de interrupção mais complexo pode:

  • ser disparado somente quando esse endereço for executado por um thread específico,

  • permitir um número especificado de passagens por esse endereço antes de ser disparado,

  • emitir automaticamente um comando especificado quando ele é disparado ou

  • watch um endereço especificado na memória não executável, sendo disparado quando essa memória é lida ou gravada.

Para obter detalhes sobre como definir e controlar pontos de interrupção, consulte Usando pontos de interrupção.

Uma maneira mais complicada de executar até que um estado especificado seja atingido é usar um ponto de interrupção condicional. Esse tipo de ponto de interrupção é definido em um determinado endereço, mas só será disparado se uma condição especificada for mantida. Para obter detalhes, consulte Configurando um ponto de interrupção condicional.

Pontos de interrupção e Pseudo-Registers

Ao especificar o estado desejado, geralmente é útil usar pseudo-registros automáticos. Essas são variáveis controladas pelo depurador que permitem referenciar uma variedade de valores relacionados ao estado de destino.

Por exemplo, o ponto de interrupção a seguir usa o pseudo-registro $thread , que é sempre igual ao valor do thread atual. Ele é resolvido para o valor do thread atual quando ele é usado em um comando. Usando $thread como o argumento do parâmetro /t do comando bp (Set Breakpoint), você pode criar um ponto de interrupção que será disparado sempre que NtOpenFile for chamado pelo thread que estava ativo no momento em que você emitiu o comando bp :

kd> bp /t @$thread nt!ntopenfile

Esse ponto de interrupção não será disparado quando qualquer outro thread chamar NtOpenFile.

Para obter uma lista de pseudo-registros automáticos, consulte Sintaxe pseudo-registro.

Usando um arquivo de script para controlar a execução

Outra maneira de executar até que um estado especificado seja atingido é criar um arquivo de script que se chame recursivamente, testando o estado desejado em cada iteração.

Normalmente, esse arquivo de script conterá os tokens .if e .else . Você pode usar um comando como t (Rastreamento) para executar uma única etapa e, em seguida, testar a condição em questão.

Por exemplo, se você quiser executar até que o registro eax contenha o valor 0x1234, poderá criar um arquivo de script chamado eaxstep que contém a seguinte linha:

.if (@eax == 1234) { .echo 1234 } .else { t "$<eaxstep" }

Em seguida, emita o seguinte comando na janela Comando do Depurador:

t "$<eaxstep"

Esse comando t executará uma única etapa e executará o comando entre aspas. Esse comando é $< (Executar Arquivo de Script), que executa o arquivo eaxstep . O arquivo de script testa o valor de eax, executa o comando t e, em seguida, chama-se recursivamente. Isso continua até que o registro eax seja igual a 0x1234, momento em que o comando .echo (Echo Comment) imprime uma mensagem na janela Comando do Depurador e a execução é interrompida.

Para obter detalhes sobre arquivos de script, consulte Usando arquivos de script e usando programas de comando do depurador.

Resolução de ponto de interrupção ambíguo

Na versão 10.0.25310.1001 e posterior do mecanismo do depurador, agora há suporte para a resolução ambígua do ponto de interrupção. Pontos de interrupção ambíguos permitem que o depurador defina pontos de interrupção em determinados cenários em que uma expressão de ponto de interrupção é resolvida para vários locais. Para obter mais informações, consulte Resolução de ponto de interrupção ambíguo.

Confira também

Usando pontos de interrupção

Sintaxe do ponto de interrupção

bp, bu, bm (definir ponto de interrupção)

Resolução de ponto de interrupção ambíguo

Pontos de interrupção não resolvidos (pontos de interrupção bu)