【发布时间】:2011-09-11 20:35:17
【问题描述】:
我是 UNIX 程序的新手。我遇到了一种情况,我必须从我的 C 程序向 gdb 发出命令。我有一个 C 程序,它通过分叉一个新的子进程来调用另一个 C 程序。我需要调试这个子 C 程序,因此,我使用系统命令在这个 C 程序上调用 gdb 进程。但是我得到了一个我不想要的 gdb 提示。我想从我的父 C 程序向 gdb 发出命令。有没有办法从 C 程序向 gdb 发出命令?
请回复。
非常感谢。
Esash
【问题讨论】:
我是 UNIX 程序的新手。我遇到了一种情况,我必须从我的 C 程序向 gdb 发出命令。我有一个 C 程序,它通过分叉一个新的子进程来调用另一个 C 程序。我需要调试这个子 C 程序,因此,我使用系统命令在这个 C 程序上调用 gdb 进程。但是我得到了一个我不想要的 gdb 提示。我想从我的父 C 程序向 gdb 发出命令。有没有办法从 C 程序向 gdb 发出命令?
请回复。
非常感谢。
Esash
【问题讨论】:
如果你需要调试子进程,你fork+exec时不一定需要用GDB调用子进程。只要你有子进程的PID,就可以使用GDB中的“attach”命令附加到正在运行的子进程上。基本上,你会像这样启动 GDB:
$ gdb
(gdb) attach pid-of-child
在上面,将pid-of-child替换为子进程的PID,这样就可以从交互式GDB调试子进程,不需要父进程处理完全使用 GDB。
【讨论】:
有几种方法可以以编程方式“驱动”GDB。
如果您只想发出一个命令,例如要找出孩子坠毁的原因,您可以执行以下操作:
gdb --batch -ex where /path/to/child <pid-of-child>
如果有更多的命令,那么你愿意放在命令行上,你可以将它们写入一个临时文件,并让 gdb 执行它们:
gdb --batch -x /path/to/commandfile /path/to/child <pid-of-child>
以上都不允许您执行程序化 (if ... then do-something-in-gdb else do-something-else-in-gdb) 控制。
为此,您可能需要使用 GDB 的 machine interface (MI),或使用 embedded Python interpreter。
【讨论】:
还有后续的 fork gdb 选项。这将立即附加到子进程。
设置跟随分叉模式
所以,
设置follow-fork-mode子
【讨论】: