c - gdb - 使用管道调试

标签 c gdb

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

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 窗口执行此操作)。

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

关于c - gdb - 使用管道调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1456253/

相关文章:

c - 使用文件数组时如何更改生成的文件名?

c - 在 C 列表上添加尾节点

c - 'less' linux 命令的备用程序/使 'less' 安全

c - 如何从这个字节中提取操作数?使用二进制补码

c++ - 在 gdb 中显示参数包的值

c++ - gdb:在添加的符号文件系统提供的 DSO 中找不到可加载的部分 0x#number#

emacs - GDB 与 emacs 技巧

计算2个内存地址之间的距离

c - 在 Raspberry PI 上用 C 从图像中读取 RGB 数据

linux - gdb 无法解析 linux 内核的符号