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

问题描述 投票:0回答:7

问题抄自这里

我有一个程序,它接受输入 stdin 还带有一些参数 从命令行。看起来像这样:

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

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

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

但是,gdb 不喜欢它。

不幸的是,我不理解解决方案,并且不知道除了使用

-g
选项编译并运行命令 M-x gdb 之外还能做什么。

http-redirect emacs gdb command-line-arguments
7个回答
157
投票

如果你是从 shell 中执行此操作,你会这样做:

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

这似乎也适用于 emacs。


35
投票

有几种方法可以做到:

$ 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
设置的参数。


7
投票

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

运行

gdb your_program
后,如果您只输入
run < file_containing_input
,程序将一直运行到最后,您可能无法发现问题,因此在执行
run < file_containing_input
之前先休息一下。像这样的东西

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

5
投票

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

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

1
投票

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

$ gdb myprogram xxx

其中 xxx 是进程 ID。那么你不需要告诉 gdb 起始参数。


0
投票

我想指出 mkfifo 的技术,如下所述:

gdb - 使用管道进行调试

如果您有一个比仅读取一个文件更复杂的管道,例如:

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

mkfifo 非常方便。


0
投票

char *argv[]

获取输入

在bash中

$> ./myprogram -path "/home/user/work"

在gdb中

(gdb) run -path "/home/user/work"

从标准输入获取输入

与猫相处的第一种方式:

在bash中

$> cat ./input.txt | ./program

在gdb中

(gdb) run < ./input.txt

第二种方式使用命令:

在bash中

$> python -c 'print("input")' | ./myprogram 

在gdb中

(gdb) run < <(python -c 'print("input")')

bash 进程替换 <(cmd) trick

如果有多个readline:

在gdb中

(gdb) run < <(python -c 'print("readline1")') <(python -c 'print("readline2")')

来源:https://www.labri.fr/perso/fleury/posts/security/payload-injection.html

© www.soinside.com 2019 - 2024. All rights reserved.