首页 文章

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

提问于
浏览
28

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

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

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

如何成功调试子进程?

1 回答

  • 71

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

    分叉后尝试在分叉后的子进程执行的代码中安装 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
    

相关问题