Domanda

Sto usando Visual Studio, sviluppando un'applicazione nativa, ho un breakpoint programmatico (assert) nel mio codice inserito usando __asm ??int 3 o __debugbreak. A volte, quando lo colpisco, vorrei disabilitarlo in modo che gli hit successivi nella stessa sessione di debug non si interrompano più nel debugger. Come posso farlo?

È stato utile?

Soluzione

x86 / x64

Supponendo che tu stia scrivendo l'applicazione x86 / x64, scrivi quanto segue nella finestra dell'orologio:

x86: * (char *) eip, x

x64: * (char *) rip, x

Dovresti vedere un valore 0xcc, che è opcode per INT 3. Sostituiscilo con 0x90, che è opcode per NOP. Puoi anche usare la finestra di memoria con eip come indirizzo.

PPC

Supponendo che tu stia scrivendo un'applicazione PPC (ad esempio Xbox 360), scrivi quanto segue nella finestra dell'orologio:

* (int *) iar, x

Dovresti vedere un valore 0xfeNNNNNN, che è opcode per trap (il più delle volte 0x0fe00016 = trap incondizionato). Sostituirlo con 0x60000000, che è codice operativo per NOP.

Altri suggerimenti

Potresti provare qualcosa del genere:

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

Questo dovrebbe colpire il debug solo una volta. Potresti anche mostrare una finestra di messaggio all'utente e chiedere cosa fare: continua (non succede nulla), interrompi (viene chiamato int 3) o ignora (ignora è impostato su vero, il punto di interruzione non viene mai più colpito)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top