#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?
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