我在这里阅读了很多关于这个主题的问题/答案,但没有一个解决方案有效......我想将 perl 生成的字符串传递给 gdb 正在调试的可执行文件。但我什至无法传递转义的十六进制字符......我尝试了以下“解决方案”:
1:
$ gdb ./a.out
(gdb) r "\x41"
2:
perl -e 'print "\x41"' > input.cmd
$ gdb ./a.out
(gdb) r < input.cmd
3:
$ gdb --args ./a.out "\x41"
(gdb) r
4:
$ gdb ./a.out
(gdb) set args "\x41"
(gdb) r
而且我还尝试了许多不同的转义字符组合 ",/,\, ', ` ... 都没有用。解决方案 2 在 SO 上的许多帖子中都有讨论,但我得到 "<"作为参数(gdb正在将所有内容转义为字符串)
我什至尝试调试 bash 并将可执行文件设置为未成年人,但 bash 崩溃了......
我错过了什么?我在 macOS 10.13 上使用 gdb 8.0.1
更新:
刚刚在 linux 机器上试过,上面的解决方案有效。我猜问题出在 macOS 上的 bash/gdb 交互上……有什么想法吗?
更新 2:
已解决
绝对是 macOS 上 gdb 内部 bash 调用的问题,设法像这样解决:
$ gdb --args ./a.out $(perl -e 'print "\x41"')
最佳答案
perl -e 'print "\x41"' > input.cmd
你可以做 echo A > input.cmd
这个:
2
(gdb) r < input.cmd
完全您所要求的(./a.out
运行并在其 A
上接收单个字符 stdin
)。
but none of the solutions worked...
您必须告诉我们您是如何得出该结论的。
更新:
when I do
(gdb) r < input.cmd
gdb passes two strings as arguments<
andinput.cmd
如果是这种情况,您的 GDB 损坏了,或者(更有可能)损坏了 $SHELL
.
GDB 只需调用 $SHELL -c './a.out < input.cmd'
,并期待您的 $SHELL
执行重定向。如果您的 shell 不这样做,那么一切都将失败。
您可以在 dtruss -f
下运行 GDB看看 GDB 做了什么,以及你的 shell 做了什么。
关于bash - 将标准输入参数传递给正在使用 gdb 调试的可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47185581/