Když jsem se podíval sem, našel jsem následující způsob:
void main(int argc, char** argv)
{
asm("int $3");
int a = 3;
a++; // In gdb> print a; expect result to be 3
}
Tohle mi připadá jako hloupé. A myslím, že to funguje pouze na architektuře x86.
Jedním ze způsobů je signalizovat přerušení:
#include <csignal>
// Generate an interrupt
std::raise(SIGINT);
V C:
#include <signal.h>
raise(SIGINT);
AKTUALIZACE :Microsoft Docs říká, že Windows ve skutečnosti nepodporuje SIGINT
, takže pokud jde o přenositelnost, pravděpodobně bude lepší použít SIGABRT
.
SIGINT není podporován pro žádnou aplikaci Win32. Když dojde k přerušení CTRL+C, operační systémy Win32 vygenerují nový podproces, který toto přerušení konkrétně zpracuje. To může způsobit, že aplikace s jedním vláknem, například v systému UNIX, se stane vícevláknovou a způsobí neočekávané chování.
V projektu, na kterém pracuji, děláme toto:
raise(SIGABRT); /* To continue from here in GDB: "signal 0". */
(V našem případě jsme chtěli tvrdě havarovat, pokud se to stalo mimo ladicí program, a pokud to bylo možné, vygenerovat zprávu o havárii. To je jeden z důvodů, proč jsme použili SIGABRT. Přenositelnost na Windows, Mac a Linux zabrala několik pokusů. Nakonec jsme měli několik #ifdefs, užitečný komentář zde:http://hg.mozilla.org/mozilla-central/file/98fa9c0cff7a/js/src/jsutil.cpp#l66.)