Gdb 如何使用信号调试程序? #包括 #包括 正在调试的静态易失性sig_原子=1; 静态void int3_处理程序(int signo){正在调试=0;} int main() { 信号(信号陷阱、int3_处理器); __asm____________;volatile____; 如果(正在调试){ puts(“不,我不想为你服务。”); 而(1){ /*无限循环*/; } } puts(“是的,这里有真正的惯例。”); 返回0; }

Gdb 如何使用信号调试程序? #包括 #包括 正在调试的静态易失性sig_原子=1; 静态void int3_处理程序(int signo){正在调试=0;} int main() { 信号(信号陷阱、int3_处理器); __asm____________;volatile____; 如果(正在调试){ puts(“不,我不想为你服务。”); 而(1){ /*无限循环*/; } } puts(“是的,这里有真正的惯例。”); 返回0; },gdb,signals,Gdb,Signals,当在gdb内部/外部运行时,上述命令将给出不同的输出,因为gdb捕获sigtrap信号 如何使我的程序在gdb中表现相同?当下级程序收到任何信号时,gdb将停止下级程序(正在调试) 如果您只是从GDB继续,信号将被“吞没”,这不是您想要的 您可以要求GDB继续该程序,并使用signal SIGTRAP向其发送信号 您还可以要求GDB直接将给定信号传递给下级,而不使用handle SIGTRAP nostop noprint passGDB命令停止。您需要在点击第一个SIGTRAP之前完成此操作,

当在gdb内部/外部运行时,上述命令将给出不同的输出,因为gdb捕获sigtrap信号


如何使我的程序在gdb中表现相同?

当下级程序收到任何信号时,gdb将停止下级程序(正在调试)

如果您只是从GDB
继续
,信号将被“吞没”,这不是您想要的

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


您还可以要求GDB直接将给定信号传递给下级,而不使用
handle SIGTRAP nostop noprint pass
GDB命令停止。您需要在点击第一个
SIGTRAP

之前完成此操作,您可能也在查看ptrace sigcall。如果有人设置GDB将sigtrap传递给程序,那么这里的代码将无法调试GDB。然而,如果您尝试自己进行ptrace,那么如果您在GDB(已经ptrace)下运行,您将不会成功,并且没有办法防止/隐藏这一点。
#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;
}