我正在调试这样一个多进程应用程序,
如何在fork()
ed进程之间切换?
答案 0 :(得分:16)
您可以将子进程置于休眠状态,然后将新的GDB实例附加到该进程。 GDB User Manual描述了这个过程如下(重点是我的):
在大多数系统上,gdb没有特殊之处 支持调试程序 使用。创建其他进程 叉功能。当程序分叉时, gdb将继续调试父级 进程和子进程将运行 畅通。如果你设置了一个 孩子的任何代码中的断点 然后执行,孩子会得到一个 SIGTRAP信号(除非它 捕获信号)将导致它 终止。
但是,如果你想调试 子进程有一个解决方法 这不是太痛苦。打个电话 睡在孩子的代码里面 进程在fork之后执行。的它 只有在a时睡觉才有用 设置了某个环境变量, 或某个文件存在,以便 如果不这样做,则不需要延迟 想要对孩子运行gdb。同时 孩子正在睡觉,使用ps 程序来获取其进程ID。然后 告诉gdb( gdb的新调用if 你也在调试父母 过程)附加到孩子身上 过程(见附件)。从那时起 你可以调试子进程 就像你的任何其他过程一样 附于。
它的长短是因为当你启动一个稍后分叉的程序时,GDB将保持与父进程的连接(尽管你可以使用set follow-fork-mode child
来跟踪子进程)。通过将其他进程置于休眠状态,您也可以将新的GDB实例连接到它。
使用set detach-on-fork off
将这两个进程保持在gdb的控制之下。默认情况下,父进程将照常调试,子进程将暂停,但通过调用set follow-fork-mode child
,您可以更改此行为(以便子进程将照常调试,父进程将被暂停)。 GDB User Manual描述了此过程如下:
gdb将保留对所有分叉的控制权 进程(包括嵌套分叉)。 您可以列出分叉的进程 在gdb的控制下使用
info inferiors
命令,并切换 通过使用。从一个叉子到另一个叉子inferior
命令(请参阅Debugging Multiple Inferiors and Programs)。退出调试其中一个分叉 进程,你可以从中分离出来 它使用
detach inferiors
命令(允许它运行 独立),或使用kill inferiors
命令。请参阅Debugging Multiple Inferiors and Programs。
答案 1 :(得分:1)
显示所有过程。
(gdb) info inferiors
Num Description Executable
1 process 1000 /tmp/a.out
* 2 <null> /tmp/a.out # current attach inferior
在不同进程之间切换。
(gdb) inferior 1
[Switching to inferior 1 [process 1000] (/tmp/a.out)]
[Switching to thread 1.1 (LWP 1000)]