fork之后调试子进程(跟随fork-mode子配置)
我正在开发一个应用程序,父母要求孩子处理某些任务。 我遇到了一个问题,我已经将gdb配置为follow-fork-mode子,但是在fork之后,在到达断点之后,它发送了一个SIGTRAP,但是孩子以某种方式终止并将SIGCHLD发送给父服务器。
我已经在fork之前配置了signal(SIGTRAP, SIG_IGN)
,所以我的理解是,当达到断点但是它没有发生时,孩子应该inheritance并忽略SIGTRAP。
如果我不对,请帮助我理解这一点。
如何成功调试子进程?
子进程从父进程inheritance信号处理程序,但不从待处理信号inheritance。
在分叉之后,尝试在分叉后的子进程执行的代码中安装SIGTRAP
的信号处理程序。 如果您不处理SIGTRAP
,则默认操作是终止子进程。
如果要调试子进程,则必须使用follow-fork-mode
。 您必须使用设置模式
set follow-fork-mode child
但是,现在只能调试子节点,并且父节点运行未选中。
有另一种调试子进程的方法。
执行fork()
之后,在子代数执行的代码中放入sleep()
调用,使用ps
实用程序获取子代的PID,然后附加PID。
attach
现在,您可以调试子进程,就像任何其他进程一样。
调试后,您可以使用分离PID
detach