Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C gdb-使用管道进行调试_C_Gdb - Fatal编程技术网

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)