Chr*_*ick 16
您可以将子进程置于休眠状态,然后将新的GDB实例附加到该进程.在GDB用户手册描述了这一过程如下(重点是我的):
在大多数系统上,gdb对调试程序没有特殊支持,这些程序使用fork函数创建其他进程.当一个程序分叉时,gdb将继续调试父进程,子进程将无阻碍地运行.如果您在子进程执行的任何代码中设置了断点,则子进程将获得SIGTRAP信号(除非它捕获信号)将导致它终止.
但是,如果要调试子进程,则有一种不太痛苦的解决方法.在fork之后执行子进程执行的代码中调用sleep.仅当设置了某个环境变量或存在某个文件时才睡眠,这样当您不想在子项上运行gdb时就不会发生延迟.当孩子正在睡觉时,使用ps程序获取其进程ID.然后告诉gdb(如果你也在调试父进程,则调用 gdb 的新方法)以附加到子进程(请参阅Attach).从那时起,您可以调试子进程,就像您附加到的任何其他进程一样.
它的长短是因为当你启动一个稍后分叉的程序时,GDB将保持与父进程的连接(尽管你可以遵循子进程,而不是使用set follow-fork-mode child).通过将其他进程置于休眠状态,您也可以将新的GDB实例连接到它.
用于set detach-on-fork off在gdb的控制下保存这两个进程.默认情况下,父进程将照常调试,子进程将被暂停,但通过调用,set follow-fork-mode child您可以更改此行为(以便子进程将照常调试,父进程将被暂停).在GDB用户手册介绍了如下这个过程:
gdb将保留对所有分叉进程(包括嵌套分支)的控制.您可以使用该
info inferiors命令在gdb的控制下列出分叉进程,并使用该 命令从一个fork切换到另一个forkinferior(请参阅调试多个Inferiors和程序).要退出调试其中一个分叉进程,可以使用该
detach inferiors命令(允许它独立运行)从中分离,或使用该kill inferiors命令终止它 .请参阅调试多个Inferiors和程序.