ba (interrupção no acesso)
O comando ba define um ponto de interrupção do processador (geralmente chamado, com menos precisão, de ponto de interrupção de dados). Esse ponto de interrupção é acionado quando a memória especificada é acessada.
Modo de usuário
[~Thread] ba[ID] Access Size [Options] [Address [Passes]] ["CommandString"]
Modo kernel
ba[ID] Access Size [Options] [Address [Passes]] ["CommandString"]
Parâmetros
Fio
Especifica o thread ao qual o ponto de interrupção se aplica. Para obter mais informações sobre a sintaxe, confira Sintaxe do thread. Você pode especificar threads somente no modo de usuário.
ID
Especifica um número opcional que identifica o ponto de interrupção. Se você não especificar o ID, o primeiro número de ponto de interrupção disponível será usado. Não é possível adicionar espaço entre ba e o número do ID. Cada processador aceita apenas um número limitado de pontos de interrupção do processador, mas não há restrição no valor do ID. Se você colocar o ID entre colchetes ([]), o ID poderá incluir qualquer expressão. Para obter mais informações sobre a sintaxe, consulte Sintaxe de expressão numérica.
Acesso
Especifica o tipo de acesso que satisfaz o ponto de interrupção. Esse parâmetro pode usar um dos valores a seguir.
Opção | Ação |
---|---|
e (executar) |
Interrompe o depurador quando a CPU recupera uma instrução do endereço especificado. |
r (leitura/gravação) |
Interrompe o depurador quando a CPU lê ou grava no endereço especificado. |
w (gravação) |
Interrompe o depurador quando a CPU grava no endereço especificado. |
i (e/s) |
(Somente modo kernel, somente sistemas baseados em x86) Interrompe o depurador quando a porta de E/S no Endereço especificado é acessada. |
Tamanho
Especifica o tamanho do local, em bytes, a ser monitorado quanto ao acesso. Em um processador baseado em x86, esse parâmetro poderá ser 1, 2 ou 4. No entanto, se Access for igual a e, Size deverá ser 1.
Em um processador baseado em x64, esse parâmetro poderá ser 1, 2, 4 ou 8. No entanto, se Access for igual a e, Size deverá ser 1.
Options Especifica as opções de ponto de interrupção. Você pode usar qualquer número das seguintes opções, exceto conforme indicado:
/1
Cria um ponto de interrupção "de uso único". Depois que esse ponto de interrupção é acionado, o ponto de interrupção é removido permanentemente da lista de pontos de interrupção.
/p EProcess
(Somente modo kernel) Especifica um processo associado a esse ponto de interrupção. EProcess deve ser o endereço real da estrutura do EPROCESS, não o PID. O ponto de interrupção será acionado somente se for encontrado no contexto desse processo.
/t EThread
(Somente modo kernel) Especifica um thread associado a esse ponto de interrupção. EThread deve ser o endereço real da estrutura ETHREAD, não o ID do thread. O ponto de interrupção será acionado somente se for encontrado no contexto desse thread. Se você usar /p EProcess e /t EThread , poderá inseri-los em qualquer ordem.
/c MaxCallStackDepth
Faz com que o ponto de interrupção fique ativo somente quando a profundidade da pilha de chamadas for menor que MaxCallStackDepth. Não é possível combinar essa opção com /C.
/C MinCallStackDepth
Faz com que o ponto de interrupção fique ativo somente quando a profundidade da pilha de chamadas for maior que MinCallStackDepth. Não é possível combinar essa opção com /c.
/w expressão de objeto dx Define um ponto de interrupção condicional com base no valor booleano retornado pela expressão de objeto dx. O argumento é uma expressão de modelo de dados (dx) que é avaliada como true (corresponde a condição – interrupção) ou false (não corresponde à condição – sem interrupção).
O exemplo define um ponto de interrupção condicional com base no valor de globalVariable. Isso permite que um ponto de interrupção de acesso, por exemplo, verifique o valor que foi gravado ao determinar se o depurador deve interromper.
ba w 4 /w "mymodule!globalVariable == 4" mymodule!globalVariable
O exemplo mostra como definir um ponto de interrupção usando JavaScript.
ba w 4 /w "@$scriptContents.myFunc(mymodule!globalVariable)" mymodule!globalVariable
Para obter mais informações sobre objetos do depurador, consulte dx (Expressão para exibir modelo de objeto de depurador).
Para obter mais informações sobre pontos de interrupção condicionais, consulte Como definir um ponto de interrupção condicional.
Endereço
Especifica um endereço inválido. Se o aplicativo acessar a memória nesse endereço, o depurador interromperá a execução e exibirá os valores atuais de todos os registradores e sinalizadores. Esse endereço deve ser um deslocamento e estar adequadamente alinhado para corresponder ao parâmetro Size. (Por exemplo, se Size for 4, Address deverá ser um múltiplo de 4.) Se você omitir Address, o ponteiro de instrução atual será usado. Para obter mais informações sobre a sintaxe, consulte Endereço e sintaxe de intervalo de endereços.
Passa
Especifica o número de vezes em que o ponto de interrupção é passado até ser ativado. Esse número pode ser qualquer valor de 16 bits. O número de vezes que o contador de programas passa por esse ponto sem interromper é um a menos do que o valor desse número. Portanto, omitir esse número é o mesmo que defini-lo como 1. Observe também que esse número conta apenas as vezes que o aplicativo é executado após esse ponto. Executar ou traçar além desse ponto não conta. Depois que a contagem completa for atingida, você poderá redefinir esse número limpando e redefinindo o ponto de interrupção.
Sequência de comandos
Especifica uma lista de comandos a serem executados sempre que o ponto de interrupção for encontrado o número especificado de vezes. Esses comandos serão executados somente se o ponto de interrupção for atingido depois que você emitir um comando g (Ir), em vez de depois de um comando t (Traçar) ou p (Executar). Os comandos do depurador em CommandString podem incluir parâmetros.
Você deve colocar essa cadeia de caracteres de comando entre aspas e separar vários comandos por ponto-e-vírgula. Você pode usar caracteres de controle C padrão (como \n e \"). Os ponto-e-vírgulas contidos entre aspas de segundo nível (\") são interpretados como parte da cadeia de caracteres entre aspas incorporada.
Esse parâmetro é opcional.
Ambiente
Item | Descrição |
---|---|
Modos | modo de usuário, modo kernel |
Destinos | somente depuração ao vivo |
Plataformas | all |
Informações Adicionais
Para obter mais informações sobre pontos de interrupção do processador, consulte Pontos de interrupção do processador (pontos de interrupção ba). Para obter mais informações e exemplos de uso de pontos de interrupção, outros comandos de ponto de interrupção e métodos de controle desses pontos, além de informações sobre como definir pontos de interrupção no espaço do usuário a partir de um depurador de kernel, consulte Como usar pontos de interrupção. Para obter mais informações sobre pontos de interrupção condicionais, consulte Como definir um ponto de interrupção condicional.
Comentários
O depurador usa o número de ID para se referir aos comandos do ponto de interrupção bc (limpar ponto de interrupção), bd (desativar ponto de interrupção) e be (ativar ponto de interrupção).
Use o comando bl (lista de pontos de interrupção) para listar todos os pontos de interrupção existentes, seus números de ID e seu status.
Use o comando .bpcmds (Exibir comandos de ponto de interrupção) para listar todos os pontos de interrupção existentes, seus números de ID e os comandos que foram usados para criá-los.
Cada ponto de interrupção do processador tem um tamanho associado a ele. Por exemplo, um ponto de interrupção do processador w (gravação) poderia ser definido no 0x70001008 de endereço com um tamanho de quatro bytes. Isso monitoraria o bloco de endereços de 0x70001008 a 0x7000100B, inclusive. Se esse bloco de memória for gravado, o ponto de interrupção será acionado.
Pode acontecer de o processador executar uma operação em uma região de memória que se sobrepõe à região especificada, mas não sendo idêntica. No exemplo, uma única operação de gravação que inclui o intervalo 0x70001000 a 0x7000100F, ou uma operação de gravação que inclui apenas o byte em 0x70001009, seria uma operação de sobreposição. Em tal situação, o acionamento do ponto de interrupção depende do processador. Você deve consultar o manual do processador para obter detalhes específicos. Para tomar uma instância específica, em um processador x86, um ponto de interrupção de leitura ou gravação será acionado sempre que o intervalo acessado se sobrepuser ao intervalo de ponto de interrupção.
Da mesma forma, se um ponto de interrupção e (executar) for definido no 0x00401003 de endereços e, em seguida, uma instrução de dois bytes abrangendo os endereços 0x00401002 e 0x00401003 for executada, o resultado dependerá do processador. Novamente, consulte o manual de arquitetura do processador para obter detalhes.
O processador distingue entre pontos de interrupção definidos por um depurador no modo de usuário e pontos de interrupção definidos por um depurador no modo kernel. Um ponto de interrupção do processador no modo de usuário não afeta nenhum processo no modo kernel. Um ponto de interrupção do processador no modo kernel pode ou não afetar um processo de modo de usuário, dependendo de o código de modo de usuário estar usando o estado de registro de depuração e se há um depurador de modo de usuário anexado.
Para aplicar os pontos de interrupção de dados existentes do processo atual a um contexto de registro diferente, use o comando .apply_dbp (Aplicar ponto de interrupção de dados ao contexto).
Em um computador com vários processadores, cada ponto de interrupção do processador se aplica a todos os processadores. Por exemplo, se o processador atual for o 3 e você usar o comando ba e1 MyAddress
para colocar um ponto de interrupção em MyAddress, qualquer processador (não apenas o processador 3) que for executado nesse endereço acionará o ponto de interrupção. (Isso também vale para pontos de interrupção de software.)
Não é possível criar vários pontos de interrupção do processador no mesmo endereço que são diferentes apenas em seus valores CommandString. No entanto, você pode criar vários pontos de interrupção no mesmo endereço que tenham restrições diferentes (por exemplo, valores diferentes das opções /p, /t, /c e /C).
Para obter mais detalhes sobre pontos de interrupção do processador e restrições adicionais que se aplicam a eles, consulte Pontos de interrupção do processador (pontos de interrupção ba).
Os exemplos a seguir mostram o comando ba. O comando a seguir define um ponto de interrupção para acesso de leitura em 4 bytes da variável myVar.
0:000> ba r4 myVar
O comando a seguir adiciona um ponto de interrupção em todas as portas seriais com endereços de 0x3F8 a 0x3FB. Esse ponto de interrupção será acionado se algo for lido ou gravado nessas portas.
kd> ba i4 3f8