Qual é a diferença entre pontos de interrupção de software e de hardware e quais vantagens eles oferecem um ao outro?

Os pontos de interrupção do software substituem um código de operação da instrução por um "código de operação do ponto de interrupção" especial. Os detalhes variam de acordo com o conjunto de instruções e o ambiente, mas o conceito básico permanece o mesmo: Os pontos de interrupção do software modificam o texto original do programa.

Isso torna os pontos de interrupção do software muito escalonáveis: você pode ter tantos pontos de interrupção de software quanto o depurador estiver disposto a rastrear.

Quando você atinge um ponto de interrupção do software, o depurador precisa modificar o texto do programa de volta ao seu estado original - ocultando todos os pontos de interrupção do software - para que tudo fique como deveria quando você inspeciona o estado da máquina. Quando você retoma a execução, o depurador deve seguir uma única etapa sobre a instrução no ponto de interrupção, reinstalar todos os pontos de interrupção do software e reiniciar a execução.

Dependendo da arquitetura específica do processador com a qual você está lidando e do suporte para a etapa única controlada por software, isso pode ser bastante simples ou bastante envolvido. Em qualquer um dos casos, um depurador competente irá tratá-lo da melhor maneira possível.

Os pontos de interrupção do hardware usam hardware dedicado para examinar o contador de programas e parar a máquina quando atingir o endereço especificado. O depurador não precisa modificar nenhum texto do programa para configurar um ponto de interrupção de hardware. Ele só precisa configurar alguns registros na lógica do depurador de hardware.

Então, quais são alguns prós e contras? Uma lista não exaustiva:

  • Pontos de interrupção de hardware são um recurso limitado. Você pode ter apenas um pequeno número deles, como apenas 1 ou não mais que 4. Por outro lado, você pode ter tantos pontos de interrupção de software quanto o depurador desejar oferecer suporte. Você pode definir pontos de interrupção de hardware na memória somente leitura e auto código de modificação. O depurador não pode modificar a ROM ou o flash para instalar pontos de interrupção do software. E o código auto-modificável (incluindo vinculadores dinâmicos e JITs) pode substituir quaisquer pontos de interrupção de software que você possa ter instalado. Os pontos de interrupção de hardware também podem servir como pontos de rastreamento. Em vez de interromper a máquina, o ponto de interrupção do hardware insere um "cheguei aqui!" registro em um log de rastreamento no nível do sistema sem reduzir a velocidade da máquina. Ambos os pontos de interrupção de hardware e software podem oferecer funcionalidade de ponto de interrupção condicional. Para o ponto de interrupção do hardware, algumas condições podem ser comparadas no hardware dedicado. Para ambos, o software do depurador pode precisar entrar e ler algum estado do sistema para determinar se a condição é atendida. Os pontos de interrupção do hardware oferecem uma ligeira vantagem de eficiência, pois o depurador não precisa remover os pontos de interrupção do software e adicioná-los novamente.

Ambos os estilos de ponto de interrupção estão sujeitos a problemas de "endereço de ponto de interrupção inválido". Ou seja, é possível tentar definir um ponto de interrupção no meio de uma instrução, em vez de diretamente no limite de uma instrução.

Para pontos de interrupção do hardware, o pior que acontece é que o hardware não para quando executa uma instrução que se sobrepõe ao endereço do ponto de interrupção (alinhado incorretamente). Ou poderia fazer melhor e parar sempre que a CPU executar uma instrução que se sobreponha ao endereço do ponto de interrupção do hardware.

Para pontos de interrupção do software, a situação é pior: se o depurador sobrescreve o meio de uma instrução válida, ele acaba corrompendo uma instrução válida. O depurador pode realmente quebrar um programa dessa maneira.