2009-09-15 5 views
3

J'ai trouvé des informations sur cette fonctionnalité sur SO il y a quelque temps, mais le sujet était un doublon de Hidden Features of Visual Studio (2005-2008)? et je peux ' Je ne le trouve plus.Arrêter l'exécution de mon programme et aller au débogueur sans définir de points d'arrêt (Visual Studio/GCC et C++)

Je veux utiliser quelque chose comme ceci:

#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); 

Il doit se comporter comme un point d'arrêt en cas d'erreur. C'est quelque chose comme l'affirmation, mais pas de dialogues, et plus léger.

Je ne peux pas utiliser les points d'arrêt normaux ici, car mon module fait partie de plusieurs projets et peut être édité dans plusieurs solutions VS. Cela provoque des points d'arrêt, qui ont été définis dans une solution, se déplacent quelque part dans la source, lorsque le code est édité dans une autre solution.

Répondre

9

Jetez un oeil à DebugBreak

provoque une exception breakpoint de se produire dans le processus en cours. Cela permet au thread appelant de signaler au débogueur de gérer l'exception.

exemple:

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

Merci! Je l'ai trouvé il y a trop peu de secondes :) C'est étrange: j'ai cherché environ une heure - rien trouvé. Et après que la question est posée, la bonne réponse a été trouvée dans la documentation en une minute :) – zxcat

2

Peut-être que cela devrait aider à: How to add a conditional breakpoint in Visual C++

+0

Étrange, mais votre lien contient aussi la bonne réponse. Je n'ai pas ouvert ce sujet, parce que son titre ressemble à quelque chose d'autre - les vrais points de rupture conditionnels, pas ce dont j'ai besoin. – zxcat

2

J'oublie, j'ai besoin ARM construit aussi, et l'un d'entre eux est compilé pas dans MS Visual Studio :)

De plus, il vaut mieux ne pas lier de code supplémentaire dans la version bibliothèque de mon module. La nécessité d'inclure "winbase.h" pour DebugBreak() était une "mauvaise chose", le mieux est d'avoir un peu intrinsèque. Mais cela est peu « mauvaise chose », parce qu'il n'y aura pas de points d'arrêt dans la version finale :)

Avec l'aide de réponse de crashmstr que j'ai trouvé les alternatives de DebugBreak(). Et maintenant j'utilise la construction suivante:

#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; } 
Questions connexes