gdb – 用pipe道debugging

假设我有两个程序叫做blahret 。 我想通过I / Oredirect来debugging接收来自ret程序的input的程序。 如何在使用gdb的情况下debuggingblah程序?

bash> ret | blah 

起初,你可以运行程序并通过pid进行debugging。 当然,这个解决scheme并不能涵盖所有情况。

另一种方法是使用Linuxfunction进行进程间通信。 简而言之,您将ret的输出redirect到一个FIFO特殊文件(“命名pipe道”),然后通过debugging器从该FIFO中读取。 这是如何完成的。 从bash中运行:

 mkfifo foo 

这将在您的目录中创build一个特殊文件,作为命名pipe道 。 当你向这个文件写入文本时(使用相同的语法echo "Hello" >foo ),写入程序将被阻塞,直到有人从文件中读取数据(例如cat <foo )。 在我们的例子中,一个gdb控制的进程将从这个文件读取。

在创build一个fifo之后,从bash运行:

 ret > foo & # ampersand because it may block as nobody is reading from foo gdb blah 

然后,在gdb提示符下运行

 run <foo 

并获得预期的效果。 请注意,你不能从fifo(和通常的pipe道)读取数据两次:当你读完所有的数据时, blah进程就会死掉,你应该重复写给foo的命令(你可以这样做从另一个shell窗口)。

完成后,使用rm foo删除fifo(或者将其放到系统重新启动时自动删除的目录中,例如/tmp )。

GDB的run命令使用bash来执行redirect。 一个简单的方法来实现相当于ret | blah ret | blah是使用bash的进程replacefunction。

 $ gdb blah ... (gdb) run < <(ret) 

说明:bash用类似/dev/fd/123东西替代<(ret) ,这是ret的stdout的文件描述符。 除了我们不必自己手动创build它,也不必担心ret过程的生命周期,我们可以使用该fd类似于另一个答案中所述的命名的FIFO。