Dans MSVC, DebugBreak () ou __ debugbreak provoquent la rupture d'un débogueur. Sur x86, cela équivaut à écrire "_asm int 3", sur x64, c'est quelque chose de différent. Lors de la compilation avec gcc (ou tout autre compilateur standard), je veux également faire une pause dans le débogueur. Existe-t-il une fonction indépendante de la plateforme ou intrinsèque? J'ai vu question XCode à ce sujet, mais cela ne semble pas assez portable.
Sidenote: Je veux principalement implémenter ASSERT avec cela, et je comprends que je peux utiliser assert () pour cela, mais je veux aussi écrire DEBUG_BREAK ou quelque chose dans le code.
Qu'en est-il de la définition d'une macro conditionnelle basée sur #ifdef qui se développe en différentes constructions basées sur l'architecture ou la plateforme actuelle.
Quelque chose comme:
#ifdef _MSC_VER
#define DEBUG_BREAK __debugbreak()
#else
...
#endif
Cela serait étendu par le préprocesseur l'instruction de pause du débogueur correcte basée sur la plate-forme où le code est compilé. De cette façon, vous utilisez toujours DEBUG_BREAK
dans votre code.
Une méthode portable sur la plupart des systèmes POSIX est la suivante:
raise(SIGTRAP);
GCC a une fonction intégrée nommée __builtin_trap
Que vous pouvez voir ici , cependant on suppose que l'exécution du code s'arrête une fois que cela est atteint.
vous devez vous assurer que l'appel __builtin_trap()
est conditionnel, sinon aucun code ne sera émis après.
ce poste alimenté par l'ensemble des 5 minutes de test, YMMV.
Cela ressemble à une bibliothèque compat appropriée https://github.com/scottt/debugbreak
Je viens d'ajouter n module à portable-snippets (une collection d'extraits de code portable du domaine public) pour ce faire. Ce n'est pas 100% portable, mais il devrait être assez robuste:
__builtin_debugtrap
Pour certaines versions de clang (identifiées par __has_builtin(__builtin_debugtrap)
)__debugbreak
__breakpoint(42)
int $03
.inst 0xde01
.inst 0xd4200000
.inst 0xe7f001f0
bpt
__builtin_trap
signal.h
Et defined(SIGTRAP)
(c'est-à-dire POSIX), raise(SIGTRAP)
raise(SIGABRT)
À l'avenir, le module dans les extraits portables peut s'étendre pour inclure d'autres logiques et j'oublierai probablement de mettre à jour cette réponse, vous devriez donc y rechercher des mises à jour. C'est du domaine public (CC0), alors n'hésitez pas à voler le code.
Si vous considérez assert (x) assez portable, assert (false) semble être la solution portable évidente à votre problème.
Cela semble être une très bonne solution portable à cette question: https://github.com/scottt/debugbreak
L'en-tête fourni dans le référentiel cité (debugbreak.h) encapsule les MSVC
__debugbreak,
et
__asm__ volatile("int $0x03");
sur i386 et x86_64, et sur ARM il implémente
__asm__ volatile(".inst 0xe7f001f0");
ainsi que la documentation de certaines solutions de contournement pour les problèmes notés dans l'en-tête pour une seule étape après le point d'arrêt dans GDB plus un script Python pour étendre GDB sur les plateformes où stepi = ou cont rester coincé. Le script ajoute debugbreak-step et debugbreak-continue à GDB.
Si vous essayez de déboguer une condition liée à un crash, un bon abandon à l'ancienne vous donnera une pile d'appels sur la plupart des plateformes. L'inconvénient est que vous ne pouvez pas continuer à partir du PC actuel, ce que vous ne voulez probablement pas faire de toute façon.