2024-05-23 19:22:15 发布
网友
假设我有一个名为blah和ret的两个程序。我想调试通过I/O重定向接收来自ret程序输入的blah程序。在以下使用gdb的情况下,如何调试blah程序?
bash> ret | blah
首先,您可以运行该程序并通过pid进行调试。当然,这个解决方案并不涵盖所有情况。
另一种方法是使用Linux功能进行进程间通信。简而言之,将ret的输出重定向到FIFO特殊文件(“命名管道”),然后通过调试器从该FIFO读取。这是怎么做的。从bash运行:
ret
mkfifo foo
这将在您的目录中创建一个特殊文件,该文件将用作命名管道。当您向该文件写入文本时(使用相同的语法echo "Hello" >foo),写入程序将阻塞,直到有人从文件中读取数据为止(例如cat <foo)。在我们的例子中,gdb控制的进程将从这个文件中读取。
echo "Hello" >foo
cat <foo
创建fifo后,从bash运行:
ret > foo & # ampersand because it may block as nobody is reading from foo gdb blah
然后,在gdb提示符下,运行
run <foo
达到预期效果。注意,您不能从fifo(以及通常的管道)读取数据两次:当您读取了所有数据后,blah进程将终止,您应该重复向foo写入命令(您可以从另一个shell窗口执行)。
blah
完成后,使用rm foo删除fifo(或将其放入系统重新启动时将自动删除的目录中,例如/tmp)。
rm foo
/tmp
GDB的run命令使用bash执行重定向。实现ret | blah等价物的一个简单方法是使用bash的process substitution特性。
run
bash
ret | blah
$ gdb blah ... (gdb) run < <(ret)
说明:bash用类似于/dev/fd/123的内容替换<(ret),这是ret的stdout的文件描述符。我们可以使用类似于另一个答案中描述的命名FIFO的fd,只是我们不需要自己手动创建它,也不必担心ret进程的生命周期。
/dev/fd/123
<(ret)
首先,您可以运行该程序并通过pid进行调试。当然,这个解决方案并不涵盖所有情况。
另一种方法是使用Linux功能进行进程间通信。简而言之,将
ret
的输出重定向到FIFO特殊文件(“命名管道”),然后通过调试器从该FIFO读取。这是怎么做的。从bash运行:这将在您的目录中创建一个特殊文件,该文件将用作命名管道。当您向该文件写入文本时(使用相同的语法
echo "Hello" >foo
),写入程序将阻塞,直到有人从文件中读取数据为止(例如cat <foo
)。在我们的例子中,gdb控制的进程将从这个文件中读取。创建fifo后,从bash运行:
然后,在gdb提示符下,运行
达到预期效果。注意,您不能从fifo(以及通常的管道)读取数据两次:当您读取了所有数据后,
blah
进程将终止,您应该重复向foo写入命令(您可以从另一个shell窗口执行)。完成后,使用
rm foo
删除fifo(或将其放入系统重新启动时将自动删除的目录中,例如/tmp
)。GDB的
run
命令使用bash
执行重定向。实现ret | blah
等价物的一个简单方法是使用bash的process substitution特性。说明:bash用类似于
/dev/fd/123
的内容替换<(ret)
,这是ret
的stdout的文件描述符。我们可以使用类似于另一个答案中描述的命名FIFO的fd,只是我们不需要自己手动创建它,也不必担心ret
进程的生命周期。相关问题 更多 >
编程相关推荐