Interrompere l'esecuzione del mio programma e passare al debugger senza impostare i punti di interruzione (Visual Studio / GCC e C ++)
-
07-07-2019 - |
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.
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
Forse questo su dovrebbe aiutare: Come aggiungere un punto di interruzione condizionale in Visual C ++
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; }