35
A
回答
41
首先,您可以运行该程序并通过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
)。
9
GDB的run
命令使用bash
执行重定向。实现相当于ret | blah
的简单方法是使用bash的process substitution功能。
$ gdb blah
...
(gdb) run < <(ret)
说明:bash的替代<(ret)
喜欢的东西/dev/fd/123
,这是ret
标准输出的文件描述符。除了我们不必自己手动创建它,也不必担心ret
进程的生命周期,我们可以使用该fd与指定的FIFO相似。
相关问题
- 1. 使用gdb调试Unix管道
- 2. 用gdb调试
- 3. GDB与管道输入(未参数)调试
- 4. 用gdb调试C
- 5. 使用gdb调试回调
- 6. GDB管道输入到调试文件,而无需使用一个文件
- 7. 的Gstreamer调试管道C++
- 8. 如何调试scrapy管道?
- 9. 使用GDB调试模板
- 10. 使用gdb来调试C++
- 11. 使用gdb调试pthreads
- 12. 使用gdb调试qemu
- 13. 使用gdb调试conio.h
- 14. 如何使用GDB调试
- 15. 使用GDB调试Android
- 16. 使用GDB调试iPhone
- 17. 使用GDB进行调试
- 18. 使用gdb调试Java .jar
- 19. 使用gdb调试llvm pass
- 20. 使用GDB调试进程
- 21. 用Eclipse CDT和GDB调试
- 22. gdb print NSString调试
- 23. GDB调试保护
- 24. GDB调试警告
- 25. GDB远程调试
- 26. gdb调试奇怪
- 27. 用GDB调试编程调用函数
- 28. gdb/mi gdb服务器调试
- 29. 从亚马逊数据管道中的管道调用管道
- 30. 使用GDB调试iOS应用程序
这是不同于:http://stackoverflow.com/questions/4521015/how-to-pass-arguments-and-redirect-stdin-from-a-file-to-program-run-in-gdb – 2015-07-02 18:27:34