Como desativar um ponto de interrupção programática / assert?
-
02-07-2019 - |
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?
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)