2013-02-28 47 views
22

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

我叉之前已配置signal(SIGTRAP, SIG_IGN)所以我的理解是,孩子要继承和忽略SIGTRAP到达断点,但没有发生的时候。

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

如何成功调试子进程?

+2

取下PID“到达断点后* ... ...,它会发送一个SIGTRAP ... *”这是调试器被通知断点的方式。 “* ...孩子以某种方式终止... *”正常或异常终止?您可以对父节点中的'wait [...]([...,]&status [,...])''返回的值使用'WIFEXITED(status)'来检查。详细信息请参阅man 3 wait。 – alk 2013-02-28 07:01:05

回答

59

子进程继承父进程的信号处理程序,但不是挂起的信号。

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

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

set follow-fork-mode child 

模式。然而,现在只有孩子可以调试,和父运行选中。

还有一种调试子进程的肮脏方法。

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

attach <PID of child process> 

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

调试后,您可以使用

detach