【问题标题】:Debugging child process after fork (follow-fork-mode child configured)fork后调试子进程(follow-fork-mode子配置)
【发布时间】:2013-02-28 03:32:08
【问题描述】:

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

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

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

如何才能成功调试子进程?

【问题讨论】:

  • "... 到达断点后,它会发送一个 SIGTRAP ..." 这是通知调试器有关断点的方式。 “...孩子以某种方式终止...”正常或异常终止?您可以在父级中 wait[...]([...,]&status[, ...]) 返回的值上使用 WIFEXITED(status) 来检查这一点。详情请见man 3 wait

标签: c gdb signals fork


【解决方案1】:

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

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

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

设置模式
set follow-fork-mode child

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

an alternative way调试子进程。

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

attach <PID of child process>

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

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

detach

【讨论】:

  • After fork() is executed, put a sleep() call in the code where the child executes, get the PID of the child using the ps utility, then attach the PID. - 不附加到子进程会再次导致sleep() 执行吗?如果我错了,请纠正我。
  • @YugSingh 不,您需要使用这样的结构将 sleep() 放在子代码中:switch (fork()) { case -1: /* fork error code */ case 0: sleep(30); /* and the rest of child code */ default: /* this is the parent code */ }
猜你喜欢
  • 2016-03-11
  • 1970-01-01
  • 2013-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多