web-dev-qa-db-fra.com

Existe-t-il un équivalent portable à DebugBreak () / __ debugbreak?

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.

49
vividos

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.

13
Jorge Ferreira

Une méthode portable sur la plupart des systèmes POSIX est la suivante:

raise(SIGTRAP);
39
caf

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.

12
Hasturkun

Cela ressemble à une bibliothèque compat appropriée https://github.com/scottt/debugbreak

9
pixelbeat

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))
  • Sur MSVC et le compilateur Intel C/C++: __debugbreak
  • Pour ARM Compilateur C/C++: __breakpoint(42)
  • Pour x86/x86_64, assemblage: int $03
  • Pour ARM Thumb, Assembly: .inst 0xde01
  • Pour ARM AArch64, assemblage: .inst 0xd4200000
  • Pour les autres BRAS, assemblage: .inst 0xe7f001f0
  • Pour Alpha, Assembly: 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 defined(SIGTRAP) (c'est-à-dire POSIX), raise(SIGTRAP)
    • Sinon, 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.

8
nemequ

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

4
Suma

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.

1
QwazyWabbit

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.

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

1
johnwbyrd