我为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
也暗示相同。
答案 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的问题。