Pergunta

Estou usando o Visual Studio, o desenvolvimento de um aplicativo nativo, eu tenho um ponto de interrupção programática (assert) no meu código colocado usando __asm ??int 3 ou __debugbreak. Às vezes, quando eu bati, eu gostaria de desativá-lo para que acertos sucessivos na mesma sessão de depuração não invadir o depurador. Como posso fazer isso?

Foi útil?

Solução

x86 / x64

Assumindo que você está escrevendo x86 / x64 aplicação, escrita seguinte na janela do seu relógio:

x86: *(char *)eip,x

x64: *(char *)rip,x

Você deverá ver uma 0xCC valor, que é código de operação para INT 3. Substitua-o por 0x90, que é código de operação para NOP. Você também pode usar a janela de memória com EIP como um endereço.

PPC

Assumindo que você está escrevendo aplicação PPC (por exemplo, Xbox 360), write seguinte na janela do seu relógio:

*(int *)iar,x

Você deverá ver um valor 0xfeNNNNNN, que é código de operação para armadilha (na maioria das vezes 0x0fe00016 = armadilha incondicional). Substituí-lo com 0x60000000, que é código de operação para NOP.

Outras dicas

Você pode tentar algo como isto:

#define ASSERT(x) {\
   if (!(x)) \
   { \
      static bool ignore = false; \
      if (!ignore) \
      { \
         ignore = true; \
         __asm int 3 \
      } \
   }\
}

Esta deve bater a depuração somente uma vez. Você pode até mostrar um messagebox para o usuário e perguntar o que fazer: continuar (nada acontece), pausa (int 3 é chamado) ou ignorar (ignore é definido como verdadeiro, o ponto de interrupção nunca é atingido novamente)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top