c++ - usar - gdb tutorial español
Establezca el punto de interrupción en el código C o C++ programáticamente para gdb en Linux (5)
Al mirar here , 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 hackoso. Y creo que esto solo funciona en la arquitectura x86.
¿Cómo puedo establecer un punto de interrupción en C o código C ++ programáticamente que funcionará para gdb en Linux?
Es decir:
int main(int argc, char** argv)
{
/* set breakpoint here! */
int a = 3;
a++; /* In gdb> print a; expect result to be 3 */
return 0;
}
En OS X puedes simplemente llamar a std::abort()
(puede ser lo mismo en Linux)
En un proyecto en el que trabajo, hacemos esto:
raise(SIGABRT); /* To continue from here in GDB: "signal 0". */
(En nuestro caso, queríamos bloquear mucho si esto ocurría fuera del depurador, generando un informe de fallas si fuera posible. Esa es una de las razones por las que usamos SIGABRT. Hacer esto de forma portátil en Windows, Mac y Linux llevó varios intentos. Terminamos con algunos #ifdefs, útilmente comentado aquí: http://hg.mozilla.org/mozilla-central/file/98fa9c0cff7a/js/src/jsutil.cpp#l66 .)
Una forma es señalar una interrupción:
#include <csignal>
// Generate an interrupt
std::raise(SIGINT);
Cª:
#include <signal.h>
raise(SIGINT);
ACTUALIZACIÓN : MSDN afirma que Windows realmente no es compatible con SIGINT
, por lo que si la portabilidad es una preocupación, probablemente sea mejor utilizar SIGABRT
.
__asm__("int $3");
Deberia trabajar:
int main(int argc, char** argv)
{
/* set breakpoint here! */
int a = 3;
__asm__("int $3");
a++; /* In gdb> print a; expect result to be 3 */
return 0;
}