gdb-使用pip调试

2024-05-23 19:22:15 发布

您现在位置:Python中文网/ 问答频道 /正文

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

bash> ret | blah 

Tags: 程序bash情况重定向blahretgdb
2条回答

首先,您可以运行该程序并通过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)。

GDB的run命令使用bash执行重定向。实现ret | blah等价物的一个简单方法是使用bash的process substitution特性。

$ gdb blah
...
(gdb) run < <(ret)

说明:bash用类似于/dev/fd/123的内容替换<(ret),这是ret的stdout的文件描述符。我们可以使用类似于另一个答案中描述的命名FIFO的fd,只是我们不需要自己手动创建它,也不必担心ret进程的生命周期。

相关问题 更多 >