【问题标题】:How to debug programs using signals?如何使用信号调试程序?
【发布时间】:2011-05-15 11:36:02
【问题描述】:
#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 中表现相同?

【问题讨论】:

  • 您可能也在关注 ptrace sigcall。如果有人设置其 gdb 以将 SIGTRAP 传递给程序,此处的代码将无法调试 GDB。但是,如果您尝试自己 ptrace,如果您在 GDB 下运行(已经 ptraced),您将不会成功,并且没有办法阻止/隐藏这一点。

标签: gdb signals


【解决方案1】:

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

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

你可以让 GDB 继续这个程序并且signal SIGTRAP向它发送一个信号。

您也可以要求 GDB 将给定的信号直接传递给下级,并且使用 handle SIGTRAP nostop noprint pass GDB 命令根本不停止。您需要点击第一个SIGTRAP 之前这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    相关资源
    最近更新 更多