说我有两个名为blah和ret的程序.我想调试通过I/O重定向从ret程序接收输入的blah程序.在以下情况下如何使用gdb 调试blah程序?
bash> ret | blah
Run Code Online (Sandbox Code Playgroud)
P S*_*ved 45
首先,您可以运行该程序并通过pid进行调试.当然,该解决方案并未涵盖所有情况.
另一种方法是使用Linux功能进行进程间通信.简而言之,您将输出重定向ret到FIFO特殊文件("命名管道"),然后通过调试器从该FIFO读取.这是它的完成方式.从bash运行:
mkfifo foo
Run Code Online (Sandbox Code Playgroud)
这将在您的目录中创建一个特殊文件,用作命名管道.当您将文本写入此文件(使用相同的语法echo "Hello" >foo)时,写入程序将阻塞,直到有人从文件中读取数据(cat <foo例如).在我们的例子中,gdb控制的进程将从该文件中读取.
创建fifo后,从bash运行:
ret > foo & # ampersand because it may block as nobody is reading from foo
gdb blah
Run Code Online (Sandbox Code Playgroud)
然后,在gdb提示符下运行
run <foo
Run Code Online (Sandbox Code Playgroud)
并获得预期的效果.请注意,您无法从fifo(以及通常的管道)读取数据两次:当您读取所有数据时,blah进程会死亡,您应该重复写入foo的命令(您可以从另一个shell窗口).
完成后,删除fifo rm foo(或将其放入系统重启时自动删除的目录,例如/tmp).
Che*_*Sun 15
GDB的run命令用于bash执行重定向.实现等效的一种简单方法ret | blah是使用bash的进程替换功能.
$ gdb blah
...
(gdb) run < <(ret)
Run Code Online (Sandbox Code Playgroud)
说明:bash替换<(ret)为类似的东西/dev/fd/123,它是stdout的文件描述符ret.我们可以使用与其他答案中描述的命名FIFO类似的fd,除了我们不必自己手动创建它,也不用担心ret过程的生命周期.