fork之后调试子进程(跟随fork-mode子配置)

时间:2013-02-28 03:32:09

标签: c gdb signals fork

我正在开发一个应用程序,父母会让孩子处理某些任务。我遇到了一个问题,我将gdb配置为follow-fork-mode子,但是在fork之后,在到达断点之后,它发送了一个SIGTRAP,但是孩子以某种方式终止并将SIGCHLD发送给父。

我在fork之前配置了signal(SIGTRAP, SIG_IGN)所以我的理解是,当达到断点时,孩子应该继承并忽略SIGTRAP但是它没有发生。

如果我不对,请帮助我理解这一点。

如何成功调试子进程?

1 个答案:

答案 0 :(得分:72)

子进程从父进程继承信号处理程序,但不从待处理信号继承。

在分叉之后尝试在代码中的某个位置安装SIGTRAP的信号处理程序,其中子进程在分叉后执行。如果您不处理SIGTRAP,则默认操作是终止子项。

如果要调试子进程,则必须使用follow-fork-mode。 您必须使用

设置模式
set follow-fork-mode child

但是,现在只能调试子节点,并且父节点运行未选中。

调试子进程有an alternative way

执行fork()后,在子代码执行的代码中调用sleep(),使用ps实用程序获取子代的PID,然后附加PID。

attach <PID of child process>

现在,您可以调试子进程,就像任何其他进程一样。

调试后,您可以使用

分离PID
detach