Interrompere l'esecuzione del mio programma e passare al debugger senza impostare i punti di interruzione (Visual Studio / GCC e C ++)

StackOverflow https://stackoverflow.com/questions/1428493

Domanda

Ho trovato informazioni su questa funzione su SO qualche tempo fa, ma l'argomento era un duplicato di Funzioni nascoste di Visual Studio (2005-2008)? e non riesco più a trovarlo.

Voglio usare qualcosa del genere:

#ifdef DEBUG
#define break_here(condition) if (condition) ... // don't remember, what must be here
#else
#define break_here(condition) if (condition) return H_FAIL;
#endif
//...
hresult = do_something(...);
break_here(hresult != H_OK);
//...
var = do_other_thing(...);
break_here(var > MAX_VAR);

Deve comportarsi come un punto di interruzione in caso di errore. È qualcosa di simile a un'affermazione, ma senza dialoghi e più leggero.

Non posso usare i normali punti di interruzione qui, perché il mio modulo fa parte di diversi progetti e può essere modificato in diverse soluzioni VS. Ciò provoca punti di interruzione, impostati in una soluzione, spostati da qualche parte nell'origine, quando il codice viene modificato in un'altra soluzione.

È stato utile?

Soluzione

Dai un'occhiata a DebugBreak

  

Provoca un'eccezione del punto di interruzione nel processo corrente. Ciò consente al thread chiamante di segnalare al debugger di gestire l'eccezione.

Esempio:

 var = do_other_thing(...);
 if (var > MAX_VAR)
      DebugBreak();

Altri suggerimenti

Ho dimenticato, ho bisogno anche di build ARM e una di esse non è compilata in MS Visual Studio :)

Inoltre, è meglio per me non collegare il codice aggiuntivo nella versione della libreria del mio modulo. La necessità di includere " winbase.h " per DebugBreak () era una "cosa negativa" di esso, meglio è avere un po 'intrinseco. Ma questa è poca cosa "negativa", perché non ci saranno punti di interruzione nella versione finale :)

Con l'aiuto della risposta di crashmstr ho trovato le alternative di DebugBreak () . E ora sto usando la seguente costruzione:

#ifdef _DEBUG

    #ifdef _MSC_VER
      #ifdef _X86_
        #define myDebugBreak { __asm { int 3 } }
      #else
        #define myDebugBreak  { __debugbreak(); } // need <intrin.h>
      #endif
    #else
      #define myDebugBreak { asm { trap } } // GCC/XCode ARM11 variant
    #endif

#else

      #define myDebugBreak

#endif

#define break_here(condition) if (condition) { myDebugBreak; return H_FAIL; }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top