Как отключить программную точку останова / утверждение?

Я использую Visual Studio, разрабатываю собственное приложение, у меня есть программная точка останова (assert) в моем коде, размещенная с использованием __asm ​​int 3 или __debugbreak. Иногда, когда я нажимаю на него, я хотел бы отключить его, чтобы последовательные попадания в одном и том же сеансе отладки больше не вторгались в отладчик. Как я могу это сделать?


person Suma    schedule 22.09.2008    source источник


Ответы (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.

person Suma    schedule 22.09.2008
comment
на win32 вам, возможно, придется сделать свой сегмент кода доступным для записи. Тем не менее, отличный ответ! - person Nils Pipenbrinck; 22.09.2008
comment
Я делаю это на Win32 и никогда не видел проблем с возможностью записи сегментов кода. Не могли бы вы уточнить еще? Я буду рад включить в ответ дополнительные детали, чтобы сделать его лучше. - person Suma; 22.09.2008
comment
Вроде обнаружилось мое незнание x64. :) Теперь я вспомню, что многие коды операций одинаковы для x86 / x64. Спасибо. - person Suma; 20.11.2008

Вы можете попробовать что-то вроде этого:

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

Это должно попасть в отладку только один раз. Вы даже можете показать пользователю окно сообщения и спросить, что делать: продолжить (ничего не происходит), break (вызывается int 3) или игнорировать (ignore имеет значение true, точка останова больше никогда не попадает)

person Fili    schedule 03.06.2011