我开发一个应用程序,它的父进程派生了子来处理某些任务。 我在那里我已经配置了GDB遵循叉型孩子,但叉之后,达到一个断点后,它会发送SIGTRAP但孩子莫名其妙地终止和发送SIGCHLD给父的问题。
我已经配置signal(SIGTRAP, SIG_IGN)
叉之前,所以我的理解是,孩子要继承和到达断点时忽略SIGTRAP但它没有发生。
请帮我理解这一点,如果我不正确。
我怎样才能成功地调试子进程?
我开发一个应用程序,它的父进程派生了子来处理某些任务。 我在那里我已经配置了GDB遵循叉型孩子,但叉之后,达到一个断点后,它会发送SIGTRAP但孩子莫名其妙地终止和发送SIGCHLD给父的问题。
我已经配置signal(SIGTRAP, SIG_IGN)
叉之前,所以我的理解是,孩子要继承和到达断点时忽略SIGTRAP但它没有发生。
请帮我理解这一点,如果我不正确。
我怎样才能成功地调试子进程?
子进程继承父信号处理程序,而不是等待状态信号。
分叉尝试安装了信号处理后SIGTRAP
在代码中分叉后的子进程在执行的地方。 如果你不处理SIGTRAP
,默认的操作是,孩子被终止。
如果你想调试子进程,则必须使用follow-fork-mode
。 您必须使用设置模式
set follow-fork-mode child
然而,现在只有孩子可以调试,和父运行选中。
还有另一种方法调试子进程。
之后fork()
执行,把sleep()
在子女执行的代码调用,使用得到孩子的PID ps
工具,然后装上PID。
attach <PID of child process>
现在,您可以调试子进程,像任何其他过程。
调试完毕后,您可以使用分离的PID
detach