fork之后调试子进程(跟随fork-mode子配置)

ihs*_*san 29 c gdb fork signals

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

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

如果我不对,请帮助我理解这一点.

如何成功调试子进程?

Bar*_*mar 77

子进程从父进程继承信号处理程序,但不从待处理信号继承.

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

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

set follow-fork-mode child
Run Code Online (Sandbox Code Playgroud)

但是,现在只能调试子项,并且父项运行未选中.

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

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

attach <PID of child process>
Run Code Online (Sandbox Code Playgroud)

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

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

detach
Run Code Online (Sandbox Code Playgroud)