Wie kann ich programmgesteuert einen Haltepunkt in C- oder C ++ - Code festlegen, der für gdb unter Linux funktioniert?
Dh:
int main(int argc, char** argv)
{
/* set breakpoint here! */
int a = 3;
a++; /* In gdb> print a; expect result to be 3 */
return 0;
}
int main
eher alsvoid main
.return 0
ist aber nicht nötig und ist nur Lärm!Antworten:
Eine Möglichkeit besteht darin, einen Interrupt zu signalisieren:
In C:
UPDATE : MSDN gibt an, dass Windows nicht wirklich unterstützt
SIGINT
. Wenn also Portabilität ein Problem darstellt, sollten Sie es wahrscheinlich besser verwendenSIGABRT
.quelle
__debugbreak()
und NICHT__debug_break()
, wie Sie hier sehen könnenIn einem Projekt, an dem ich arbeite, machen wir Folgendes:
(In unserem Fall wollten wir hart abstürzen, wenn dies außerhalb des Debuggers geschah, und wenn möglich einen Absturzbericht generieren. Dies ist ein Grund, warum wir SIGABRT verwendet haben. Dies portabel für Windows, Mac und Linux zu tun, erforderte mehrere Versuche. Am Ende hatten wir einige #ifdefs, hier hilfreich kommentiert: http://hg.mozilla.org/mozilla-central/file/98fa9c0cff7a/js/src/jsutil.cpp#l66 .)
quelle
breakpoint()
Funktion in Ihr Programm einfügen (sie kann leer sein oder nur eine print-Anweisung enthalten) undbreak breakpoint
zu Ihrer hinzufügen~/.gdbinit
.Als ich hier nachgesehen habe , habe ich folgenden Weg gefunden:
Das scheint mir ein bisschen hackisch zu sein. Und ich denke, das funktioniert nur auf x86-Architektur.
quelle
cl.exe
) von Microsoft unterstützt diese Syntax nicht, verwendet jedoch eine andere Syntax.int 3
Löst unter Linux ein SIGTRAP aus.__asm__("int $3");
sollte arbeiten:quelle
#define
das, damit ich mich nicht an die Syntax erinnern muss. Ich habe es in meinem Code verteilt, manchmal anstelle vonassert()
, da ich beim Stoppen des Debiuggers alle Variablen und den Stapel untersuchen möchte. Und natürlich muss ich es, wie behauptet, nicht für den Produktionscode entfernenEnttäuschend, so viele Antworten zu sehen, bei denen das dedizierte Signal nicht für Software-Haltepunkte verwendet wird
SIGTRAP
:quelle
Unter OS X können Sie einfach anrufen
std::abort()
(unter Linux ist es möglicherweise dasselbe).quelle