gdb – 用pipe道debugging
假设我有两个程序叫做blah和ret 。 我想通过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。