Как отключить программную точку останова / заявить? - PullRequest
17 голосов
/ 22 сентября 2008

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

Ответы [ 2 ]

31 голосов
/ 22 сентября 2008

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.

4 голосов
/ 03 июня 2011

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

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

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

...