Al buscar aquí, encontré la siguiente manera:
void main(int argc, char** argv)
{
asm("int $3");
int a = 3;
a++; // In gdb> print a; expect result to be 3
}
Esto me parece un poco hackish. Y creo que esto solo funciona en la arquitectura x86.
Una forma es señalar una interrupción:
#include <csignal>
// Generate an interrupt
std::raise(SIGINT);
En C:
#include <signal.h>
raise(SIGINT);
ACTUALIZAR :Microsoft Docs dice que Windows realmente no es compatible con SIGINT
, por lo que si la portabilidad es una preocupación, probablemente sea mejor usar SIGABRT
.
SIGINT no es compatible con ninguna aplicación Win32. Cuando ocurre una interrupción CTRL+C, los sistemas operativos Win32 generan un nuevo subproceso para manejar específicamente esa interrupción. Esto puede hacer que una aplicación de un solo subproceso, como una en UNIX, se convierta en multiproceso y provoque un comportamiento inesperado.
En un proyecto en el que trabajo, hacemos esto:
raise(SIGABRT); /* To continue from here in GDB: "signal 0". */
(En nuestro caso, queríamos colapsar fuertemente si esto ocurría fuera del depurador, generando un informe de fallas si era posible. Esa es una de las razones por las que usamos SIGABRT. Hacer esto de forma portátil en Windows, Mac y Linux tomó varios intentos. Terminamos con algunos #ifdefs, útil comentario aquí:http://hg.mozilla.org/mozilla-central/file/98fa9c0cff7a/js/src/jsutil.cpp#l66 .)