Partilhar via


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

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.

Observação 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. Existem dois tipos fundamentais de pontos de interrupção: os pontos de interrupção do processador, que são controlados pelo processador, e os pontos de interrupção do software, que são controlados pelo depurador. Os pontos de interrupção do processador geralmente são definidos nos dados do programa - esta é a razão pela qual eles são chamados de "pontos de interrupção de dados" - mas também podem ser definidos em código executável. Os pontos de interrupção de software são geralmente definidos em código executável, mas também podem ser definidos em dados do programa. Infelizmente, é comum na literatura de depuração referir-se aos pontos de interrupção do processador como "pontos de interrupção de dados", mesmo quando eles são definidos em código executável.

Pontos de interrupção do processador

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

Tipo de ponto de interrupção Ação
e (executar) Acionado quando o processador recupera uma instrução do endereço especificado.
r (leitura/gravação) Acionado quando o processador lê ou grava memória no endereço especificado.
w (gravação) Acionado quando o processador grava memória no endereço especificado.
I (E/S) Acionado 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 de processador w (escrita) pode ser colocado no endereço 0x70001008 com um tamanho de quatro bytes. Isso monitoraria o bloqueio de endereços de 0x70001008 a 0x7000100B, inclusive. Se esse bloco de memória for escrito, o ponto de interrupção será acionado.

Pode acontecer que o processador execute uma operação em uma região de memória que se sobrepõe, mas não é idêntica a, a região especificada. No exemplo dado 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 é acionado 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 por "debug register" ou "debug control register". Para tomar um tipo de processador específico como exemplo, em um processador x86, um ponto de interrupção de leitura ou gravação é acionado sempre que o intervalo acessado se sobrepõe ao intervalo de pontos de interrupção.

Da mesma forma, se um ponto de interrupção e (executar) 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 de 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 em modo núcleo pode ou não afetar um processo em modo utilizador, dependendo de o código em modo utilizador estar a utilizar o estado do registo de depuração e de haver um depurador em modo utilizador ligado.

Para aplicar os pontos de interrupção de dados existentes do processo atual a um contexto de registro diferente, use o comando .apply_dbp (Apply Data Breakpoint to Context ).

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 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 executar nesse endereço acionará 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 quebra. O depurador lembra o 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 quebra. Quando o processo de destino executa o código nesse local, a instrução de quebra faz com que o processo entre no depurador. Depois de executar as ações que escolher, pode fazer com que o alvo retome a execução. A execução será retomada com a instrução que estava originalmente nesse local.

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

A opção i (i/o) está disponível apenas 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 dos pontos de interrupção de software e dos 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 quebra. Isso não corrompe a imagem executável, porque 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, definir um ponto de interrupção de software em um local de dados é seguro somente se você tiver certeza de que esse local será usado apenas como código executável.

Os comandos bp, bu e bm definem os pontos de interrupção do software substituindo a instrução do processador por uma instrução break. Portanto, eles não podem ser usados em código somente leitura ou qualquer outro código que não possa ser sobrescrito. 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 apenas no comando que é executado automaticamente quando o ponto de interrupção é acionado. 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 principal ou equivalente) não pode ser um ponto de interrupção do processador.

O número de pontos de interrupção do processador suportados 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 (set Breakpoint),bm (set Symbol Breakpoint) e bu (set Unresolved Breakpoint). 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 aplicam-se 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 lista 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 os pontos de interrupção do processador com a notação "e", "r", "w" ou "i" seguida pelo tamanho do bloco. Esta caixa de diálogo pode ser usada para modificar qualquer ponto de interrupção. A caixa de texto Comando nesta 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, comece 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 registradores de depuração do processador. É possível definir um ponto de interrupção editando manualmente um valor de registro de depuração, mas isso é fortemente desencorajado.