¿Cómo puedo establecer un punto de interrupción en el código C o 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;
}
int main
lugar devoid main
.return 0
embargo, no es necesario, ¡y es solo ruido!Respuestas:
Una forma es señalar una interrupción:
C ª:
ACTUALIZACIÓN : MSDN afirma que Windows realmente no es compatible
SIGINT
, por lo que si la portabilidad es un problema, probablemente sea mejor que lo useSIGABRT
.fuente
__debugbreak()
y NO__debug_break()
, como puede ver aquíEn un proyecto en el que trabajo, hacemos esto:
(En nuestro caso, queríamos bloquear con fuerza si esto sucedía fuera del depurador, generando un informe de bloqueo si fuera posible. Esa es una de las razones por las que usamos SIGABRT. Hacer esto de manera portátil en Windows, Mac y Linux requirió varios intentos. Terminamos con algunos #ifdefs, comentado amablemente aquí: http://hg.mozilla.org/mozilla-central/file/98fa9c0cff7a/js/src/jsutil.cpp#l66 .)
fuente
breakpoint()
función en su programa (puede estar vacía o simplemente contener una declaración de impresión) y agregarbreak breakpoint
a su~/.gdbinit
.Al mirar aquí , encontré la siguiente forma:
Esto me parece un poco hackeo. Y creo que esto solo funciona en arquitectura x86.
fuente
cl.exe
) no admite esta sintaxis, pero usa una sintaxis diferente.int 3
genera un SIGTRAP.__asm__("int $3");
Deberia trabajar:fuente
#define
esto, para no tener que recordar la sintaxis. Lo tengo esparcido por todo mi código, a veces en lugar deassert()
, ya que al detener el depurador, permítame examinar todas las variables y la pila. Y, por supuesto, como afirmar, no tengo que eliminarlo para el código de producciónEs decepcionante ver tantas respuestas que no utilizan la señal dedicada para los puntos de interrupción del software
SIGTRAP
:fuente
En OS X puedes simplemente llamar
std::abort()
(podría ser lo mismo en Linux)fuente