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

我有一个程序 还接受一些参数 from command line. It looks like this:

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

我尝试用 gdb 调试代码 在 emacs 中,通过 M-x gdb,我尝试 load the program with the command:

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

However, gdb does not like it.

给你抄袭的问题。 不幸的是,我不理解解决方案,并且不确定除了使用 -g选项进行编译和运行命令 M-x gdb 之外还要做些什么。

85176 次浏览

如果你从一个外壳开始,你会这样做:

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

这似乎也适用于 emacs。

For completeness' sake upon starting a debugging session there is also the --args option. ie)

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

如果您不需要从一开始就进行调试,也可以使用以下方法附加到已经运行的进程:

$ gdb myprogram xxx

其中 xxx 是进程 id,那么就不需要告诉 gdb 起始参数。

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

$ 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

其中,gdbrun命令(r)默认使用先前与 set args一起设置的参数。

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

在你运行 gdb your_program之后,如果你只是键入 run < file_containing_input,程序会一直运行到最后,你可能没有发现问题,所以在你运行 run < file_containing_input之前做一个中断。就像这样

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

这是一个非常古老的问题,但是我想指出这里所描述的使用 mkffo 的技术:

Gdb-使用管道进行调试

如果管道比只读取一个文件更复杂,例如:

cat jonesforth.f examples/defining-words.f - |./jonesforth

the mkfifo can be very convenient.