C gdb-使用管道进行调试
假设我有两个程序名为blah和ret。我想调试通过I/O重定向从ret程序接收输入的blah程序。在以下情况下,如何使用gdb调试blah程序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 这将在目录中创建一个特殊文
bash> ret | blah
首先,您可以运行程序并通过pid进行调试。当然,这个解决方案并不涵盖所有情况 另一种方法是使用Linux功能进行进程间通信。简而言之,您将
ret
的输出重定向到一个FIFO特殊文件(“命名管道”),然后通过调试器从该FIFO读取。这是怎么做到的。从bash运行:
mkfifo foo
这将在目录中创建一个特殊文件,用作命名管道。当您向该文件写入文本(使用相同的语法
echo“Hello”>foo
)时,写入程序将阻塞,直到有人从该文件读取数据(catGDB的run
命令使用bash
执行重定向。实现类似于ret | blah
的简单方法是使用bash的功能
$gdb废话
...
(gdb)run<如果你能提供足够的磁盘空间,你也可以直接将其放入一个常规文件foo
,而不是一个FIFOfoo
(为你保存一个命令:)。常规文件和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)