如何在gdb中的fork()ed之间切换?

我正在调试这样一个多进程应用程序,

如何在fork() ed进程之间切换?

  1. 您可以将子进程置于hibernate状态,然后将新的GDB实例附加到该进程。 GDB用户手册描述了这个过程如下(重点是我的):

    在大多数系统上,gdb对调试程序没有特殊支持,这些程序使用fork函数创建其他进程。 当程序分叉时,gdb将继续调试父进程,子进程将无阻碍地运行。 如果您在子进程执行的任何代码中设置了断点,则子进程将获得SIGTRAP信号(除非它捕获信号)将导致它终止。

    但是,如果要调试子进程,则有一种不太痛苦的解决方法。 在fork之后执行子进程执行的代码中调用sleep。 仅当设置了某个环境变量或存在某个文件时才睡眠,这样当您不想在子项上运行gdb时就不会发生延迟。 当孩子正在睡觉时,使用ps程序获取其进程ID。 然后告诉gdb( 如果你也在调试父进程,则调用 gdb 的新方法 )以附加到子进程(请参阅Attach)。 从那时起,您可以调试子进程,就像您附加到的任何其他进程一样。

    它的长短是因为当你启动一个稍后分叉的程序时,GDB将保持与父进程的连接(尽管你可以遵循子进程,而不是使用set follow-fork-mode child进程)。 通过将其他进程置于hibernate状态,您也可以将新的GDB实例连接到它。

  2. 使用set detach-on-fork off将这两个进程保持在gdb的控制之下。 默认情况下,父进程将照常调试并且子进程将被暂停,但是通过调用set follow-fork-mode child子进程可以更改此行为(以便子进程将像往常一样进行调试,父进程将是暂停)。 GDB用户手册描述了这个过程如下:

    gdb将保留对所有分叉进程(包括嵌套分支)的控制。 您可以使用info inferiors命令在gdb的控制下列出分叉进程,并使用info inferiors命令从一个fork切换到另一个fork(请参阅调试多个Inferiors和程序 )。

    要退出调试其中一个分叉进程,可以使用detach inferiors命令(允许它独立运行)从中detach inferiors ,或使用kill inferiors命令将其kill inferiors 。 请参阅调试多个Inferiors和程序 。