bash - 将标准输入参数传递给正在使用 gdb 调试的可执行文件

标签 bash macos gdb escaping pipe

我在这里阅读了很多关于这个主题的问题/答案,但没有一个解决方案有效......我想将 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 < and input.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/

相关文章:

linux - 有没有一种方法可以将bash脚本中的stdout存储到GO中的变量中?

python - 从 uwsgi 调用子进程 sudo

c++ - 没有 Cocoa 的 OSX 中的鼠标/键盘输入

macos - Coldfusion 11,独立服务器,SSL

gdb - 在 gdb 中运行多个命令

regex - 用下划线替换字符串中的所有非字母数字字符

linux - 按特定分隔符删除字符串

macos - 在 Mac 上以编程方式构建 "Open with..."的应用程序

debugging - gdb 不会在 NASM 的所有断点处停止

debugging - GDB - 获取当前线程调用堆栈上的帧总数