【问题标题】:Debugging signal handlers on Linux在 Linux 上调试信号处理程序
【发布时间】:2014-03-24 10:53:36
【问题描述】:

我已经为 SIGCHLD 设置了一个信号处理程序。出于好奇,我想尝试从 gdb 中调试信号处理程序。有什么办法可以做到吗?

我尝试在处理程序上设置断点并从 gdb 中运行二进制文件;但是我似乎无法逐条调试处理程序指令。有什么办法我可以去做吗?我尝试设置硬件断点,但这也无济于事。我正在玩的代码如下所示。

我正在 64 位 Ubuntu 机器上尝试这个。

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int VAL = 0;
void handler(int sig) {
  VAL=1;
}

int main(int argc, const char *argv[]) {
  int pid, status;
  signal(SIGCHLD, handler);

  pid = fork();
  if ( pid == 0 ) exit(0);

  wait(&status);
  printf("Returned from handler %d\n", VAL);
  return 0;
}

打印的输出是“从处理程序 1 返回”,表明 SIGCHLD 由进程而不是 gdb 处理; gdb 内部的info signal 也提出了相同的建议。

【问题讨论】:

  • volatile加到VAL变量上也无妨。 (请不要使用仅限 CAPS 的标识符)

标签: c linux systems-programming


【解决方案1】:

可以使用 GDB 的句柄命令。 handle 命令将信号列表(要处理的)作为参数,然后是动作。你也可以使用以下 gdb 选项 nostop & pass(让程序看到这个信号)。
http://sunsite.ualberta.ca/Documentation/Gnu/gdb-5.0/html_node/gdb_38.html

【讨论】:

    【解决方案2】:

    您几乎可以肯定在打开优化的情况下进行编译。这与非易失性VAL 相结合,允许您的编译器执行看似激进的优化。

    关闭优化(-O0 用于 GCC)或将 VAL 限定为 volatile 以获得所需的效果。

    【讨论】:

      【解决方案3】:

      如果您可以使用线程,那么有一种方法。创建一个线程并在条件变量上阻止它。在信号处理程序中,只需向条件变量发出信号,线程将在您设置中断的行处中断。不幸的是,直接在信号上我不确定会发生什么,根据我的经验,一些信号是 gdb 的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多