gdb - 使用管道进行调试

2023-12-07

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

bash> ret | blah 

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

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

mkfifo foo

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

创建 fifo 后,从 bash 运行:

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

然后,在 gdb 提示符下运行

run <foo

并得到想要的效果。请注意,您不能从 fifo(以及从普通管道)读取数据两次:当您读取完所有数据后,blah进程终止,您应该重复写入 foo 的命令(您可以从另一个 shell 窗口执行此操作)。

完成后,删除 fiform foo(或者放到系统重启后自动删除的目录下,如/tmp).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

gdb - 使用管道进行调试 的相关文章

随机推荐