Pontos de interrupção do processador (ba Pontos de interrupção)

Os pontos de interrupção controlados pelo processador a pedido do depurador são conhecidos como pontos de interrupção do processador ou pontos de interrupção de dados. Os pontos de interrupção controlados diretamente pelo depurador são conhecidos como pontos de interrupção de software.

Nota Embora o termo ponto de interrupção de dados seja comumente usado como sinônimo de ponto de interrupção do processador, esse termo pode ser enganoso. Há dois tipos fundamentais de pontos de interrupção: pontos de interrupção do processador, que são controlados pelo processador e pontos de interrupção de software, que são controlados pelo depurador. Os pontos de interrupção do processador geralmente são definidos nos dados do programa , esse é o motivo pelo qual eles são chamados de "pontos de interrupção de dados", mas também podem ser definidos no código executável. Os pontos de interrupção de software geralmente são definidos no código executável, mas também podem ser definidos nos dados do programa. Infelizmente, é comum na literatura de depuração se referir aos pontos de interrupção do processador como "pontos de interrupção de dados", mesmo quando eles são definidos no código executável.

Pontos de interrupção do processador

Um ponto de interrupção do processador é disparado quando um local de memória específico é acessado. Há quatro tipos de pontos de interrupção do processador, correspondentes ao tipo de acesso à memória que o dispara:

Tipo de ponto de interrupção Ação
e (execute) Disparado quando o processador recupera uma instrução do endereço especificado.
r (leitura/gravação) Disparado quando o processador lê ou grava memória no endereço especificado.
w (gravação) Disparado quando o processador grava memória no endereço especificado.
i (i/o) Disparado quando a porta de E/S no Endereço especificado é acessada.

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) pode ser definido no endereço 0x70001008 com um tamanho de quatro bytes. Isso monitoraria o bloco de endereços de 0x70001008 para 0x7000100B, inclusive. Se esse bloco de memória for gravado, o ponto de interrupção será disparado.

Pode ocorrer que o processador executa uma operação em uma região de memória que se sobrepõe, mas não é idêntica à região especificada. No exemplo fornecido no parágrafo anterior, 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 sobreposta. Nessa situação, se o ponto de interrupção é disparado depende do processador. Para obter detalhes de como essa situação é tratada em um processador específico, consulte o manual de arquitetura do processador e procure "registro de depuração" ou "registro de controle de depuração". Para usar um tipo de processador específico como exemplo, em um processador x86, um ponto de interrupção de leitura ou gravação é disparado sempre que o intervalo acessado sobrepõe o intervalo de pontos de interrupção.

Da mesma forma, se um ponto de interrupção e (execute) for definido no endereço 0x00401003 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 de modo de usuário e pontos de interrupção definidos por um depurador do modo kernel. Um ponto de interrupção do processador no modo de usuário não afeta nenhum processo de 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 se o código do modo de usuário está 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 multiprocessador, cada ponto de interrupção do processador se aplica a todos os processadores. Por exemplo, se o processador atual for 3 e você usar o comando ba e1 MyAddress para colocar um ponto de interrupção no MyAddress, qualquer processador , não apenas processador 3, que seja executado nesse endereço disparará o ponto de interrupção. Isso também vale para pontos de interrupção de software.

Pontos de interrupção de software

Os pontos de interrupção de software, ao contrário dos pontos de interrupção do processador, são controlados pelo depurador. Quando o depurador define um ponto de interrupção de software em algum local, ele substitui temporariamente o conteúdo desse local de memória por uma instrução de interrupção. O depurador se lembra do conteúdo original desse local, de modo que, se essa memória for exibida no depurador, o depurador mostrará o conteúdo original desse local de memória, não a instrução de interrupção. Quando o processo de destino executa o código nesse local, a instrução de interrupção faz com que o processo seja dividido no depurador. Depois de executar todas as ações escolhidas, você poderá fazer com que o destino retome a execução e a execução será retomada com a instrução originalmente nesse local.

Disponibilidade de tipos de ponto de interrupção do processador

A opção i (i/o) está disponível somente durante a depuração do modo kernel.

Nem todos os tamanhos de dados podem ser usados com todos os tipos de ponto de interrupção do processador. Os tamanhos permitidos dependem do processador do computador de destino. Para obter detalhes, consulte ba (Break on Access).

Limitações de pontos de interrupção de software e pontos de interrupção do processador

É possível especificar um endereço de dados em vez de um endereço de programa ao usar os comandos bp ou bm /a. No entanto, mesmo que um local de dados seja especificado, esses comandos criam pontos de interrupção de software, não pontos de interrupção do processador. Quando o depurador coloca um ponto de interrupção de software em algum local, ele substitui temporariamente o conteúdo desse local de memória por uma instrução de interrupção. Isso não corrompe a imagem executável, pois o depurador se lembra do conteúdo original desse local e, quando o processo de destino tenta executar esse código, o depurador pode responder adequadamente. Mas quando um ponto de interrupção de software é definido em um local de dados, a substituição resultante pode levar à corrupção de dados. Portanto, a configuração de um ponto de interrupção de software em um local de dados só será segura se você tiver certeza de que esse local será usado apenas como código executável.

Os comandos bp, bu e bm definem pontos de interrupção de software substituindo a instrução do processador por uma instrução de interrupção. Portanto, elas não podem ser usadas em código somente leitura ou em qualquer outro código que não possa ser substituído. Para definir um ponto de interrupção nesse código, você deve usar ba (Break on Access) com a opção e (execute).

Não é possível criar vários pontos de interrupção do processador no mesmo endereço que diferem somente no comando executado automaticamente quando o ponto de interrupção é disparado. No entanto, você pode criar vários pontos de interrupção no mesmo endereço que diferem em suas outras restrições (por exemplo, você pode criar vários pontos de interrupção no mesmo endereço usando o comando ba com valores diferentes das opções /p, /t, /c e /C ).

O ponto de interrupção inicial em um processo de modo de usuário (normalmente definido na função main ou seu equivalente) não pode ser um ponto de interrupção do processador.

O número de pontos de interrupção do processador com suporte depende da arquitetura do processador de destino.

Controlando pontos de interrupção de software e pontos de interrupção do processador

Os pontos de interrupção de software podem ser criados com os comandos bp (Definir Ponto de Interrupção),bm (Definir Ponto de Interrupção de Símbolo)e bu (Definir ponto de interrupção não resolvido ). Os pontos de interrupção do processador podem ser criados com o comando ba (Break on Access). Os comandos que desabilitam, habilitam e modificam pontos de interrupção se aplicam a todos os tipos de pontos de interrupção. Os comandos que exibem uma lista de pontos de interrupção incluem todos os pontos de interrupção e indicam o tipo de cada um. Para obter uma listagem desses comandos, consulte Métodos de controle de pontos de interrupção.

A caixa de diálogo Pontos de Interrupção do WinDbg exibe todos os pontos de interrupção, indicando pontos de interrupção do processador com a notação "e", "r", "w" ou "i" seguida pelo tamanho do bloco. Essa caixa de diálogo pode ser usada para modificar qualquer ponto de interrupção. A caixa de texto Comando nessa caixa de diálogo pode ser usada para criar qualquer tipo de ponto de interrupção. Se um ponto de interrupção do processador for desejado, inicie a entrada com "ba". Quando você define um ponto de interrupção usando o mouse na janela Desmontagem do WinDbg ou na janela Origem, o depurador cria um ponto de interrupção de software não resolvido.

Os pontos de interrupção do processador são armazenados nos registros de depuração do processador. É possível definir um ponto de interrupção editando manualmente um valor de registro de depuração, mas isso é altamente desencorajado.