我正在调试这样一个多进程应用程序,
我怎样才能在fork()
编辑流程?
-
您可以让子进程进入睡眠状态,然后将一个新的 GDB 实例附加到它。这GDB用户手册 http://sourceware.org/gdb/current/onlinedocs/gdb/Forks.html#Forks这个过程描述如下(重点是我的):
在大多数系统上,gdb 没有特殊的
支持调试程序
使用创建额外的进程
分叉功能。当程序分叉时,
gdb将继续调试父级
进程和子进程将运行
畅通。如果您设置了
孩子在任何代码中设置断点
然后执行,孩子会得到一个
SIGTRAP 信号(除非它
捕获信号)将导致它
终止。
但是,如果您想调试
子进程有一个解决方法
这并不太痛苦。拨打电话至
睡在孩子的代码中
进程在 fork 之后执行。它
仅当满足以下条件时,睡眠才可能有用:
设置了某些环境变量,
或者某个文件存在,这样
如果您不这样做,则不必发生延迟
想要在孩子上运行 gdb。尽管
孩子在睡觉,用ps
程序获取其进程ID。然后
告诉 gdb (新调用 gdb if
您也在调试父级
过程) 附加到子项上
流程(见附件)。从那时起
就可以调试子进程了
就像您进行的任何其他过程一样
附于.
总而言之,当您启动一个稍后分叉的程序时,GDB 将保持与父进程的连接(尽管您可以通过使用来跟踪子进程)set follow-fork-mode child
)。通过让其他进程进入睡眠状态,您也可以让一个新的 GDB 实例连接到它。
-
Use set detach-on-fork off
将两个进程都置于 gdb 的控制之下。默认情况下,父进程将像往常一样进行调试,而子进程将被挂起,但是通过调用set follow-fork-mode child
您可以更改此行为(以便子进程将像往常一样进行调试,而父进程将被挂起)。这GDB用户手册 http://sourceware.org/gdb/current/onlinedocs/gdb/Forks.html#Forks描述这个过程如下:
gdb 将保留对所有分叉的控制
进程(包括嵌套的分叉)。
您可以列出分叉的进程
在 gdb 的控制下,使用info inferiors
命令和开关
通过使用从一个叉子到另一个叉子inferior
命令(参见调试
多个下级和程序 http://sourceware.org/gdb/current/onlinedocs/gdb/Inferiors-and-Programs.html#Inferiors-and-Programs).
停止调试分叉之一
进程,您可以从
它通过使用detach inferiors
命令(允许它运行
独立),或使用杀死它kill inferiors
命令。看调试
多个下级和程序 http://sourceware.org/gdb/current/onlinedocs/gdb/Inferiors-and-Programs.html#Inferiors-and-Programs.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)