【发布时间】: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