【问题标题】:How to load program reading stdin and taking parameters in gdb?如何加载程序读取标准输入并在 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 之外还能做什么。

【问题讨论】:

    标签: emacs gdb redirect command-line-arguments


    【解决方案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 挖掘这些答案:stackoverflow.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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-31
      • 2018-04-28
      • 1970-01-01
      • 2012-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多