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