Als ich hier nachsah, fand ich den folgenden Weg:
void main(int argc, char** argv)
{
asm("int $3");
int a = 3;
a++; // In gdb> print a; expect result to be 3
}
Das scheint mir ein bisschen hackish zu sein. Und ich denke, das funktioniert nur auf x86-Architektur.
Eine Möglichkeit besteht darin, einen Interrupt zu signalisieren:
#include <csignal>
// Generate an interrupt
std::raise(SIGINT);
In C:
#include <signal.h>
raise(SIGINT);
AKTUALISIEREN :Microsoft Docs sagt, dass Windows SIGINT
nicht wirklich unterstützt , wenn Portabilität ein Problem darstellt, sind Sie wahrscheinlich besser dran, wenn Sie SIGABRT
verwenden .
SIGINT wird für keine Win32-Anwendung unterstützt. Wenn ein STRG+C-Interrupt auftritt, generieren Win32-Betriebssysteme einen neuen Thread, um diesen Interrupt speziell zu behandeln. Dies kann dazu führen, dass eine Singlethread-Anwendung, wie z. B. eine in UNIX, multithreaded wird und unerwartetes Verhalten verursacht.
In einem Projekt, an dem ich arbeite, machen wir Folgendes:
raise(SIGABRT); /* To continue from here in GDB: "signal 0". */
(In unserem Fall wollten wir hart abstürzen, wenn dies außerhalb des Debuggers passiert, und nach Möglichkeit einen Absturzbericht erstellen. Das ist einer der Gründe, warum wir SIGABRT verwendet haben. Um dies portabel über Windows, Mac und Linux zu machen, waren mehrere Versuche erforderlich. Am Ende hatten wir ein paar #ifdefs, hier hilfreich kommentiert:http://hg.mozilla.org/mozilla-central/file/98fa9c0cff7a/js/src/jsutil.cpp#l66 .)