如何加载程序读取标准输入并在 gdb 中获取参数?
Posted
技术标签:
【中文标题】如何加载程序读取标准输入并在 gdb 中获取参数?【英文标题】:How to load program reading stdin and taking parameters in gdb? 【发布时间】:2010-10-02 02:48:02 【问题描述】:我有一个程序从 stdin 并且还需要一些参数 从命令行。它看起来像这样:
cat input.txt > myprogram -path "/home/user/work"
我尝试用 gdb 调试代码 在 emacs 中,通过 M-x gdb,我尝试 使用命令加载程序:
gdb cat input.txt > myprogram -path "/home/user/work"
但是,gdb 不喜欢它。
问题来自here。
不幸的是,我不了解解决方案,并且不确定除了使用 -g
选项编译和运行命令 M-x gdb 之外还能做什么。
【问题讨论】:
【参考方案1】:如果你是从 shell 做的,你会这样做:
% gdb myprogram
gdb> run params ... < input.txt
这似乎也适用于 emacs。
【讨论】:
重定向似乎有效,但出现了一些错误。无法从内存中读取有效的对象文件图像。程序以代码 042 退出。有什么想法吗? 这可能是一般的 GDB 错误,可能与您在 emacs 中运行的事实无关。首先了解如何从 shell 运行 GDB(如有必要,提出新问题),然后再担心在 emacs 中运行它。 我想通了。出于某种原因,我输入了 void main(int argc, char *argv[]) 而不是“int main...”,但它让我眼前一亮。无论如何,现在一切正常;感谢您的帮助! 迟来的谢谢 - gdb 手册是一个难以挖掘的痛苦。 在使用 msys64 的 Windows 上,我得到<
和 input.txt
作为程序的 argv
参数:( 我将继续使用我的 gdb 8.2.1 挖掘这些答案:***.com/questions/3544325/…
【参考方案2】:
为了完整起见,在启动调试会话时,还有 --args 选项。即)
gdb gdbarg1 gdbarg2 --args yourprog arg1 arg2 -x arg3
【讨论】:
在启动这样的调试会话时,如何将 input.txt 作为输入重定向到 yourprog? @彼得:gdb --args yourprog.out input.txt
只有在“yourprog”需要一个文件名来指定输入而不是输入重定向时才有效。【参考方案3】:
如果您不需要从一开始就进行调试,您还可以使用以下方法附加到已经运行的进程:
$ gdb myprogram xxx
其中 xxx 是进程 ID。那么你就不需要告诉 gdb 起始参数了。
【讨论】:
您在“阅读标准输入”部分错过了对问题标题的回答。如果它更短,我会在某个地方发表一个很好的评论。【参考方案4】:有几种方法可以做到:
$ 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
设置的参数。
【讨论】:
当我在 cygwin 中使用 gdb 尝试此操作时,它不起作用。 “show args”命令显示我输入了我想要的 args,但是当我用“r”启动程序时,程序会一直等到我输入内容而不是从指定的文件中读取。 @cardiffspaceman,好吧,我不能用 Cygwin 测试它——也许他们的 gdb 版本在某种程度上受到了限制 为什么不在第三个变体中简单地使用gdb -ex 'r -path /home/user/work < input.txt' myprogram
?
@Ruslan,同样有效 - 使用 'set args ...' 只是让您有机会在运行程序之前以交互方式定义一些断点等
True,但您也可以非交互方式设置断点,例如gdb -ex 'b main' -ex 'r -path /home/user/work < input.txt' myprogram
.【参考方案5】:
这已经是十一年后了,这个问题已经有了答案,但是对于未来像我这样的人,我只是想补充一些东西。
在你运行gdb your_program
之后,如果你只是输入run < file_containing_input
,程序会一直运行到最后,你可能没有发现问题,所以在你输入run < file_containing_input
之前先休息一下。像这样的
$ gdb your_program
gdb> break main
gdb> run < file_containing_input
【讨论】:
以上是关于如何加载程序读取标准输入并在 gdb 中获取参数?的主要内容,如果未能解决你的问题,请参考以下文章