C gdb-使用管道进行调试

C gdb-使用管道进行调试,c,gdb,C,Gdb,假设我有两个程序名为blah和ret。我想调试通过I/O重定向从ret程序接收输入的blah程序。在以下情况下,如何使用gdb调试blah程序 bash> ret | blah 首先,您可以运行程序并通过pid进行调试。当然,这个解决方案并不涵盖所有情况 另一种方法是使用Linux功能进行进程间通信。简而言之,您将ret的输出重定向到一个FIFO特殊文件(“命名管道”),然后通过调试器从该FIFO读取。这是怎么做到的。从bash运行: mkfifo foo 这将在目录中创建一个特殊文

假设我有两个程序名为blahret。我想调试通过I/O重定向从ret程序接收输入的blah程序。在以下情况下,如何使用gdb调试blah程序

bash> ret | blah 

首先,您可以运行程序并通过pid进行调试。当然,这个解决方案并不涵盖所有情况

另一种方法是使用Linux功能进行进程间通信。简而言之,您将
ret
的输出重定向到一个FIFO特殊文件(“命名管道”),然后通过调试器从该FIFO读取。这是怎么做到的。从bash运行:

mkfifo foo

这将在目录中创建一个特殊文件,用作命名管道。当您向该文件写入文本(使用相同的语法
echo“Hello”>foo
)时,写入程序将阻塞,直到有人从该文件读取数据(
catGDB的
run
命令使用
bash
执行重定向。实现类似于
ret | blah
的简单方法是使用bash的功能

$gdb废话
...

(gdb)run<如果你能提供足够的磁盘空间,你也可以直接将其放入一个常规文件
foo
,而不是一个FIFO
foo
(为你保存一个命令:)。常规文件和FIFO/管道对于read()有不同的语义。如果你在一个常规文件中达到EOF,read()返回时读取的字节数可能小于指定的字节数。如果从FIFO/管道读取,则read()会阻塞,直到指定的字节数到达,或者写入管道的进程已退出。这与:
ret > foo &   # ampersand because it may block as nobody is reading from foo
gdb blah
run <foo
$ gdb blah
...
(gdb) run < <(ret)