如何加载程序读取标准输入并在 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 上,我得到 &lt;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 &lt; input.txt' myprogram @Ruslan,同样有效 - 使用 'set args ...' 只是让您有机会在运行程序之前以交互方式定义一些断点等 True,但您也可以非交互方式设置断点,例如gdb -ex 'b main' -ex 'r -path /home/user/work &lt; input.txt' myprogram.【参考方案5】:

这已经是十一年后了,这个问题已经有了答案,但是对于未来像我这样的人,我只是想补充一些东西。

在你运行gdb your_program之后,如果你只是输入run &lt; file_containing_input,程序会一直运行到最后,你可能没有发现问题,所以在你输入run &lt; file_containing_input之前先休息一下。像这样的

$ gdb your_program
gdb> break main
gdb> run < file_containing_input

【讨论】:

以上是关于如何加载程序读取标准输入并在 gdb 中获取参数?的主要内容,如果未能解决你的问题,请参考以下文章

第二章 从键盘或文件中获取标准输入:read命令

GDB:如何在调试期间调用具有修改参数的函数

Go语言获取标准输入

gdb,程序调试助手

GDB调试实战给程序传递启动参数

GDB调试工具动态加载内存管理(day04)