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/30447451/

相关文章:

c - 哪些特定的优化标志负责优化变量

c - 802.11 帧校验码 (CRC32)

c - POSIX 消息队列安全

c - 如何才能使我的数据在使用读取功能读取文件时不会被切断

linux - gdb 错误 - 文件不是可执行格式 : File format not recognized

c++ - vector.size() 的 GDB 错误值

c++ - 使用 GDB 调试时如何将 std::cin 重定向到 Linux 终端?

计算行数、单词数和字符数

c - 如何避免按 Enter 和 getchar() 只读取单个字符?

c++ - gdb 使用 All-Stop 模式单步执行单个线程