在Linux上debugging信号处理程序

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

我试着在处理程序上设置断点并从gdb中运行二进制文件; 但是我似乎不能通过指令debugging处理程序指令。 有什么办法可以去做呢? 我尝试设置一个硬件断点,但这也没有帮助。 我正在玩的代码如下所示。

我正在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也表明相同。

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

几乎可以肯定,您正在编译优化打开。 这与非易失性VAL结合使用,可以让您的编译器执行看似积极的优化。

关闭优化(对于GCC为-O0 )或将VAL限定为volatile以具有期望的效果。

如果你确定使用线程是有道理的。 创建一个线程并将其封锁在一个条件变量上。 在信号处理程序中,只需发信号通知条件变量,线程就会在您打断的线路上断开。 不幸的是直接在信号我不知道会发生什么一些信号与我的经验gdb的问题。