Я использую Visual Studio, разрабатываю собственное приложение, у меня есть программная точка останова (assert) в моем коде, размещенная с использованием __asm int 3 или __debugbreak. Иногда, когда я нажимаю на него, я хотел бы отключить его, чтобы последовательные попадания в одном и том же сеансе отладки больше не вторгались в отладчик. Как я могу это сделать?
Как отключить программную точку останова / утверждение?
Ответы (2)
x86 / x64
Предполагая, что вы пишете приложение x86 / x64, напишите в окне просмотра следующее:
x86: *(char *)eip,x
x64: *(char *)rip,x
Вы должны увидеть значение 0xcc, код операции для INT 3. Замените его на 0x90, код операции для NOP. Вы также можете использовать окно памяти с eip в качестве адреса.
PPC
Предполагая, что вы пишете приложение 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 \
} \
}\
}
Это должно попасть в отладку только один раз. Вы даже можете показать пользователю окно сообщения и спросить, что делать: продолжить (ничего не происходит), break (вызывается int 3) или игнорировать (ignore имеет значение true, точка останова больше никогда не попадает)