Riscos implicados ao definir pontos de interrupção

Ao definir pontos de interrupção especificando um endereço de memória ou um símbolo mais um deslocamento, você não deve colocar esse ponto de interrupção no meio de uma instrução.

Por exemplo, considere o código desmontado a seguir.

770000f1 5e               pop     esi
770000f2 5b               pop     ebx
770000f3 c9               leave
770000f4 c21000           ret     0x10
770000f7 837ddc00         cmp     dword ptr [ebp-0x24],0x0

As três primeiras instruções têm apenas um byte de comprimento. No entanto, a quarta instrução tem três bytes de comprimento. (Ele inclui bytes 0x770000F4, 0x770000F5 e 0x770000F6.) Se você quiser colocar um ponto de interrupção nesta instrução usando o comando bp, bu ou ba , especifique o endereço 0x770000F4.

Se você colocar um ponto de interrupção no endereço 0x770000F5 usando o comando ba , o processador colocará um ponto de interrupção nesse local. Mas esse ponto de interrupção nunca seria disparado, pois o processador considera 0x770000F4 como o endereço real da instrução.

Se você colocar um ponto de interrupção no endereço 0x770000F5 usando os comandos bp ou bu , o depurador gravará um ponto de interrupção nesse local. No entanto, esse ponto de interrupção pode corromper o destino devido à forma como o depurador cria pontos de interrupção:

  1. O depurador salva o conteúdo de 0x770000F5 e substitui essa memória por uma instrução de ponto de interrupção.

  2. Se você tentar exibir essa memória no depurador, o depurador não mostrará a instrução de ponto de interrupção que ele escreveu. Em vez disso, o depurador mostra a memória que "deveria" estar lá. Ou seja, o depurador mostra a memória original ou quaisquer modificações na memória que você fez desde a inserção do ponto de interrupção.

  3. Se você usar o comando BC para remover o ponto de interrupção, o depurador restaurará a memória original para o local adequado.

Quando você coloca um ponto de interrupção em 0x770000F5, o depurador salva esse byte e uma instrução de interrupção é escrita aqui. No entanto, quando o aplicativo é executado, ele atinge o endereço 0x770000F4 e reconhece esse endereço como o primeiro byte de uma instrução multibyte. Em seguida, o processador tenta combinar 0x770000F4, 0x770000F5 e, possivelmente, alguns bytes posteriores em uma única instrução. Essa combinação pode criar uma variedade de comportamentos, nenhum dos quais é desejável.

Portanto, ao colocar pontos de interrupção usando um comando bp, bu ou ba , certifique-se de sempre colocar os pontos de interrupção no endereço adequado. Se você estiver usando a interface gráfica do WinDbg para adicionar pontos de interrupção, não precisará se preocupar com essa situação porque o endereço correto é escolhido automaticamente.

Resolução de ponto de interrupção ambíguo

Na versão 10.0.25310.1001 e posterior do mecanismo do depurador, agora há suporte para a resolução ambígua do ponto de interrupção. Pontos de interrupção ambíguos permitem que o depurador defina pontos de interrupção em determinados cenários em que uma expressão de ponto de interrupção é resolvida para vários locais. Para obter mais informações, consulte Resolução de ponto de interrupção ambíguo.

Confira também

Usando pontos de interrupção

Sintaxe do ponto de interrupção

bp, bu, bm (definir ponto de interrupção)

Resolução de ponto de interrupção ambíguo

Pontos de interrupção não resolvidos (pontos de interrupção bu)