Как отключить программную точку останова/утверждение?
-
02-07-2019 - |
Вопрос
Я использую Visual Studio, разрабатываю собственное приложение, у меня есть программная точка останова (утверждение) в моем коде, размещенная с помощью __asm int 3 или __debugbreak.Иногда, когда я нажимаю на него, мне хотелось бы отключить его, чтобы последовательные попадания в одном и том же сеансе отладки больше не врывались в отладчик.Как я могу это сделать?
Решение
х86/х64
Предполагая, что вы пишете приложение x86/x64, напишите следующее в окне просмотра:
х86: *(char *)eip,x
х64: *(char *)rip,x
Вы должны увидеть значение 0xcc, которое является кодом операции для INT 3.Замените его на 0x90, который является кодом операции NOP.Вы также можете использовать окно памяти с eip в качестве адреса.
КПП
Предполагая, что вы пишете приложение PPC (например,Xbox 360), напишите следующее в окне часов:
*(int *)iar,x
Вы должны увидеть значение 0xfeNNNNNN, которое является кодом операции ловушки (чаще всего 0x0fe00016 = безусловная ловушка).Замените его на 0x60000000, который является кодом операции для NOP.
Другие советы
Вы можете попробовать что-то вроде этого:
#define ASSERT(x) {\
if (!(x)) \
{ \
static bool ignore = false; \
if (!ignore) \
{ \
ignore = true; \
__asm int 3 \
} \
}\
}
Это должно попасть в отладку только один раз.Вы можете даже показать пользователю окно сообщения и спросить, что делать:продолжить (ничего не происходит), прервать (вызывается int 3) или игнорировать (для игнорировать установлено значение true, точка останова больше никогда не будет достигнута)