2011-05-15 92 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