在Linux上调试信号处理程序

时间:2014-03-24 10:53:36

标签: c linux systems-programming

我为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也暗示相同。

3 个答案:

答案 0 :(得分:1)

可以使用GDB的handle命令。 handle命令作为参数获取一系列信号(待处理),然后是动作。你也可以使用以下gdb选项nostop&amp;通过(让程序看到这个信号) http://sunsite.ualberta.ca/Documentation/Gnu/gdb-5.0/html_node/gdb_38.html

答案 1 :(得分:1)

您几乎肯定会在启用优化的情况下进行编译。这与非易失性VAL结合使用,可以让编译器执行看似积极优化的操作。

关闭优化(G {-O0)或将VAL限定为volatile以获得所需效果。

答案 2 :(得分:0)

如果你可以使用线程,那就有办法了。创建一个线程并在条件变量上阻止它。在信号处理程序中只是发出条件变量的信号,线程将在你打破的行中断。不幸的是直接在信号上我不知道会发生什么事情,根据我的经验,某些信号是gdb的问题。