2011-05-15 83 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; 
} 

以上将在gdb内部/外部运行时给出不同的输出,因为gdb捕获sigtrap信号。如何使用信号调试程序?

如何使我的程序的行为在gdb一样吗?当劣接收到任何信号

+0

你可能也在看ptrace sigcall。这里的代码将无法调试GDB,如果有人设置其gdb将sigtrap传递给程序。但是,如果你试图自己追踪,如果你在GDB下运行(已经被追踪),你将不会成功,并且无法防止/隐藏它。 – xryl669 2013-04-29 08:17:05

回答

16

GDB将停止下(被调试)程序。

如果你仅仅是来自GDB的continue,信号将被“吞噬”,这不是你想要的。

你可以问问GDB继续该程序发送它的信号与signal SIGTRAP

你也可以要求GDB将给定的信号直接传递给下级,而不是用handle SIGTRAP nostop noprint pass GDB命令完全停止。您需要在之前这样做,之前您首先输入SIGTRAP