2011-05-15 16 views
10
#include <stdio.h> 
#include <signal.h> 

static volatile sig_atomic_t being_debugged = 1; 
static void int3_handler(int signo) { being_debugged = 0; } 

int main() 
{ 
     signal(SIGTRAP, int3_handler); 
     __asm__ __volatile__("int3"); 
     if (being_debugged) { 
     puts("No, I don't want to serve you."); 
       while (1) { 
      /* endless loop */ ; 
     } 
     } 
     puts("Yes, real routines go here."); 
     return 0; 
} 

Lo anterior dará diferentes resultados cuando se ejecuta dentro/fuera de gdb, porque gdb captura la señal de sigtrap.¿Cómo depurar programas usando señales?

¿Cómo hacer que mi programa se comporte igual en gdb?

+0

Probablemente también esté buscando ptrace sigcall también. El código aquí no podrá depurar GDB si alguien configuró su gdb para pasar la sigtrap al programa. Sin embargo, si intenta trazarse, no tendrá éxito si se está ejecutando bajo GDB (ya trazada), y no hay forma de prevenir/ocultar esto. – xryl669

Respuesta

16

GDB detendrá el programa inferior (que se depura) cuando el inferior recibe cualquier señal.

Si simplemente continue de GDB, la señal será "deglutida", que no es lo que desea.

Puede pedirle a GDB que continúe con el programa y envíele una señal con signal SIGTRAP.

También puede pedirle a GDB que pase una señal determinada directamente a la inferior, y que no se detenga en absoluto con el comando handle SIGTRAP nostop noprint pass GDB. Tendrá que hacer eso antes de, pulse el primer SIGTRAP.

Cuestiones relacionadas