如何使用信号调试程序?

时间:2011-05-15 11:36:02

标签: gdb signals

#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中表现相同?

1 个答案:

答案 0 :(得分:17)

当下级收到任何信号时,GDB将停止下级(被调试)程序。

如果您只是从GDB continue,信号将被“吞噬”,这不是您想要的。

您可以要求GDB继续执行程序,并使用signal SIGTRAP向其发送信号。

您也可以要求GDB将给定信号直接传递给下级,而不是使用handle SIGTRAP nostop noprint pass GDB命令完全停止。您需要在之前执行,然后点击第一个SIGTRAP