Question

En mode MSVC, DebugBreak () ou __ débogage provoque 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 aussi faire une pause dans le débogueur. Existe-t-il une fonction indépendante de la plate-forme ou intrinsèque? J'ai vu la question XCode à ce sujet, mais elle ne le fait pas. t semble assez portable.

Note: 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.

Était-ce utile?

La solution

Qu'en est-il de la définition d'une macro conditionnelle basée sur #ifdef qui s'étend à différentes constructions en fonction de l'architecture ou de la plate-forme actuelle.

Quelque chose comme:

#ifdef _MSC_VER
#define DEBUG_BREAK __debugbreak()
#else
...
#endif

Ceci serait développé par le préprocesseur la bonne instruction d'interruption du débogueur en fonction de la plate-forme où le code est compilé. De cette façon, vous utilisez toujours DEBUG_BREAK dans votre code.

Autres conseils

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 dans laquelle vous pouvez voir ici , mais l’exécution du code est supposé s’arrêter une fois que cela est atteint.

vous devriez 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 compatible appropriée https://github.com/scottt/debugbreak

Je viens d'ajouter un module à portable-snippets (une collection d'extraits de code portable du domaine public). Ce n'est pas 100% portable, mais ça devrait être assez robuste:

  • __ builtin_debugtrap pour certaines versions de clang (identifié par __ has_builtin (__ builtin_debugtrap) )
  • Sur les compilateurs MSVC et Intel C / C ++: __ debugbreak
  • Pour le compilateur ARM C / C ++: __ point d'arrêt (42)
  • Pour x86 / x86_64, assemblage: int $ 03
  • Pour ARM Thumb, l'assemblage: .inst 0xde01
  • Pour ARM AArch64, assemblage: .inst 0xd4200000
  • Pour les autres bras, assemblage: .inst 0xe7f001f0
  • Pour Alpha, assemblage: bpt
  • Pour le C non hébergé avec GCC (ou quelque chose qui se fait passer pour lui), __ builtin_trap
  • Sinon, incluez signal.h et
    • Si défini (SIGTRAP) (i.e., POSIX), augmenter (SIGTRAP)
    • Sinon, augmenter (SIGABRT)

À l'avenir, le module de portable-snippets pourrait s'étendre pour inclure une autre logique. J'oublierai probablement de mettre à jour cette réponse. Vous devriez donc y chercher des mises à jour. C'est du domaine public (CC0), alors n'hésitez pas à voler le code.

Si vous considérez assert (x) suffisamment portable, assert (false) semble être la solution portable évidente à votre problème.

Si vous essayez de déboguer une condition liée à un plantage, la méthode abort () traditionnelle vous donnera une pile d'appels sur la plupart des plates-formes. 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.

http://www.cplusplus.com/reference/cstdlib/abort/

Au lieu d'utiliser des sauts de débogage "normaux", pourquoi ne pas utiliser l'un des éléments suivants, comme une division par zéro:

int iCrash = 13 / 0;

ou déréférencer un pointeur NULL:

BYTE bCrash = *(BYTE *)(NULL);

Au moins, il est portable sur de nombreuses plates-formes / architectures.

Dans de nombreux débogueurs, vous pouvez spécifier quelle action vous souhaitez effectuer sur quelles exceptions afin que vous puissiez agir en conséquence lorsque l'une des actions ci-dessus est touchée (comme suspendre l'exécution, une instruction "int 3") et qu'une exception soit générée.

#define __debugbreak() \
do \
{       static bool b; \
        while (!b) \
                sleep(1); \
        b = false; \
} while (false)

Lorsque le processus est en veille, vous pouvez attacher un débogueur au processus, modifier la variable b pour rompre la boucle et faire votre travail. Ce code pourrait ne pas fonctionner dans une version optimisée!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top