41

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

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

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

如何成功调试子进程?

4

1 回答 1

99

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

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

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

set follow-fork-mode child

但是,现在只能调试子级,而父级运行未选中。

另一种调试子进程的方法。

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

attach <PID of child process>

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

调试后,您可以使用分离 PID

detach
于 2013-02-28T05:03:27.900 回答