Pontos de interrupção do processador (pontos de interrupção ba)
Os pontos de interrupção controlados pelo processador mediante a solicitação 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: 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 são geralmente definidos nos dados do programa (esse é o motivo pelo qual são chamados de "pontos de interrupção de dados"), mas eles 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 de programa. Infelizmente, é comum na literatura de depuração referir-se a 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 é disparado 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 dispara:
Tipo de ponto de interrupção | Ação |
---|---|
e (executar) | 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 (e/s) | 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) 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 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 de sobreposição. Em tal situação, o acionamento do ponto de interrupção 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 "registro de depuração" ou "registro de controle de depuração". Para tomar um tipo de processador específico como um exemplo, em um processador x86, um ponto de interrupção de leitura ou gravação será disparado 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 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 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 interrupção. Quando o processo de destino executa o código nesse local, a instrução de interrupção faz com que o processo entre no depurador. Depois de executar as ações escolhidas, você pode fazer com que o destino retome a execução, e 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 (e/s) está disponível somente durante a depuração no 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, confira ba (Interrupção no Acesso).
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 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. Isso não corrompe a imagem executável, porque o depurador lembra o conteúdo original desse local e, quando o processo de destino tenta executar esse código, o depurador pode responder adequadamente. Porém, 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 será 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 pontos de interrupção de software substituindo a instrução do processador por uma instrução de interrupção. Portanto, eles não podem ser usados em código somente leitura ou em outro código que não possa ser substituído. Para definir um ponto de interrupção nesse código, você deve usar ba (Interrupção no Acesso) com a opção e (executar).
Não é possível criar vários pontos de interrupção do processador no mesmo endereço que sejam diferentes apenas no comando que é 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 sejam diferentes 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 (geralmente 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 compatíveis depende da arquitetura do processador de destino.
Controlar 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 (Interrupção no Acesso). 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 lista desses comandos, confira 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 ou na Janela de origem do WinDbg, 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 não é recomendável.