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