Frage

In MSVC, Debugbreak () oder __ Debugbreak ein Debugger führen zu brechen. Auf x86 ist es gleichbedeutend mit Schreiben „_asm int 3“, auf x64 ist es etwas anderes. Wenn mit gcc (oder einem anderen Standard-Compiler) kompilieren möchte ich eine Pause in Debugger zu tun, auch. Gibt es eine plattformunabhängige Funktion oder intrinsische? Ich sah die XCode Frage darüber, aber es doesn‘ t scheinen tragbar genug.

Nebenbei bemerkt:. Ich vor allem will ASSERT implementieren mit, und ich verstehe ich assert () verwenden, für das, aber ich will auch DEBUG_BREAK oder etwas in den Code schreiben

War es hilfreich?

Lösung

Was ist ein bedingtes Makro basierend auf #ifdef definiert, die auf der Grundlage der aktuellen Architektur oder Plattform, um verschiedene Konstrukte erweitert.

So etwas wie:

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

Dies würde den richtigen Debugger Abbruchbefehl vom Präprozessor erweitert wird basierend auf der Plattform, wo der Code kompiliert wird. So können Sie immer DEBUG_BREAK in Ihrem Code verwenden.

Andere Tipps

Ein Verfahren, das für die meisten POSIX-Systeme tragbar ist:

raise(SIGTRAP);

GCC hat eine eingebaute Funktion namens __builtin_trap, die Sie sehen können hier jedoch ist es, dass die Ausführung von Code angenommen stoppt, sobald dies erreicht ist.

Sie sollte sicherstellen, dass der __builtin_trap() Anruf ist bedingt, sonst wird kein Code, nachdem sie emittiert werden.

Dieser Beitrag von allen 5 Minuten von Tests getankt, YMMV.

Das sieht aus wie eine geeignete compat Bibliothek https://github.com/scottt/debugbreak

Ich habe gerade hinzugefügt ein Modul portable-Schnipsel (eine Sammlung von public-Domain-Schnipsel von portablen Code), dies zu tun. Es ist nicht 100% tragbar, aber es sollte ziemlich robust sein:

  • __builtin_debugtrap für einige Versionen von Klirren (identifiziert mit __has_builtin(__builtin_debugtrap))
  • Auf MSVC und Intel C / C ++ Compiler: __debugbreak
  • Für ARM C / C ++ Compiler: __breakpoint(42)
  • Für x86 / x86_64, Montage: int $03
  • Für ARM Thumb, Montage: .inst 0xde01
  • Für ARM AArch64, Montage: .inst 0xd4200000
  • Für andere ARM, Montage: .inst 0xe7f001f0
  • Für Alpha, Montage: bpt
  • Für nicht gehosteten C mit GCC (oder etwas, das, wie es tarnt), __builtin_trap
  • Ansonsten sind signal.h und
    • Wenn defined(SIGTRAP) (das heißt, POSIX), raise(SIGTRAP)
    • Andernfalls raise(SIGABRT)

In der Zukunft wird das Modul in tragbaren-Schnipsel erweitern können andere Logik enthalten, und ich werde wahrscheinlich vergessen, diese Antwort zu aktualisieren, so sollten Sie nach Updates suchen dort. Es ist gemeinfrei (CC0), so fühlen sich frei, um den Code zu stehlen.

Wenn man bedenkt, behauptet (x) tragbar genug, behauptet (false) scheint die offensichtliche tragbare Lösung für Ihr Problem zu sein.

Wenn Sie versuchen, einen Crash-bezogene Bedingung zu debuggen, gute altmodische Abbruch () finden Sie auf den meisten Plattformen einen Call-Stack geben. Nachteil ist, dass Sie nicht aus dem aktuellen PC weiter, die Sie wahrscheinlich nicht wollen, auf jeden Fall tun.

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

Statt ‚normale‘ Debug-Pausen zu verwenden, warum nicht eine der folgenden Aktionen verwenden, wie eine Division durch Null:

int iCrash = 13 / 0;

oder dereferenzieren einen NULL-Zeiger:

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

Das ist zumindest portable accross viele Plattformen / Architekturen.

In vielen Debugger können Sie festlegen, welche Aktion Sie auf welchen Ausnahmen durchführen möchten, so können Sie entsprechend handeln, wenn eine der oben getroffen wird (wie Pause Ausführung, ala ein „int 3“ Befehl) und eine Ausnahme erzeugt wird.

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

Wenn der Prozess schläft, können Sie einen Debugger an den Prozess anhängen, die Variable b ändern die Schleife und mach dein Ding zu brechen. Dieser Code kann nicht in einem optimierten Build arbeiten!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top