如何在gdb中加载读取stdin并获取参数的程序?


101

我有一个程序,可以从标准输入中获取输入,也可以从命令行中获取一些参数。看起来像这样:

cat input.txt > myprogram -path "/home/user/work"

我尝试通过Mx gdb在emacs中使用gdb调试代码,我尝试使用以下命令加载程序:

gdb cat input.txt > myprogram -path "/home/user/work"

但是,gdb不喜欢它。

问题从这里开始。不幸的是,我不了解解决方案,除了使用该-g选项编译并运行命令Mx gdb 之外,我不确定该做什么。

Answers:


132

如果您是通过shell进行的,则需要这样:

% gdb myprogram
gdb> run params ... < input.txt

这似乎也可以在emacs中工作。


重定向似乎有效,但是出现一些错误。无法从内存中读取有效的目标文件图像。程序退出,代码042。有什么想法吗?
vinc456

这可能是一般的GDB错误,并且可能与您在emacs中运行这一事实无关。首先学习如何从Shell运行GDB(如有必要,还需要回答一个新问题),然后再担心在emacs中运行它。
Alnitak

1
我想到了。由于某种原因,我键入了void main(int argc,char * argv [])而不是“ int main ...”,这让我大失所望。无论如何,现在一切正常。谢谢你的帮助!
vinc456

2
迟来的谢谢-gdb手册让您难以接受。
删除了

1
在使用msys64的Windows上,我获取<input.txt作为argv程序参数:(我将继续使用我的gdb 8.2.1挖掘这些答案:stackoverflow.com/questions/3544325/…–
ixe013

32

有几种方法可以做到这一点:

$ gdb myprogram
(gdb) r -path /home/user/work < input.txt

要么

$ gdb myprogram
(gdb) set args -path /home/user/work < input.txt
(gdb) r

要么

$ gdb -ex 'set args -path /home/user/work < input.txt' myprogram
(gdb) r

其中gdb run命令(r)默认使用先前使用设置的参数set args


4
当我在cygwin中尝试使用gdb时,它不起作用。“ show args”命令显示我输入了想要的args,但是当我用“ r”启动程序时,程序将等待直到键入内容,而不是从指定文件中读取。
卡迪夫太空人2012年

1
@cardiffspaceman,好了,我不能Cygwin的测试-也许他们的GDB版本以某种方式限制
maxschlepzig

为什么不简单地gdb -ex 'r -path /home/user/work < input.txt' myprogram在第三个变体中?
Ruslan

@Ruslan,工程,以及-使用“组ARGS ...”只是给你的机会来运行程序之前交互定义了一些破发点等
maxschlepzig

是的,但是您也可以非交互地设置断点,例如gdb -ex 'b main' -ex 'r -path /home/user/work < input.txt' myprogram
Ruslan

6

为了完整起见,在启动调试会话时,还有--args选项。即

gdb gdbarg1 gdbarg2 --args yourprog arg1 arg2 -x arg3

14
启动像这样的调试会话时,如何将input.txt作为输入重定向到您的prog?
彼得·阿杰泰

1
@Peter:gdb --args yourprog.out input.txt
Ben Elgar

1
仅在“ yourprog”期望文件名指定输入而不是输入重定向的情况下有效。
Alnitak

0

而且,如果您不需要一开始就进行调试,则还可以使用以下命令将其附加到已经运行的进程中:

$ gdb myprogram xxx

其中xxx是进程ID。然后,您无需告诉gdb起始参数。


4
您没有在“阅读stdin”部分回答问题标题。如果简短的话,我会在某处发表好评论。
Notinlist 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.