在从bash进程替换完成输入后,如何继续发送到stdin?

时间:2016-12-02 01:40:01

标签: linux bash gdb pipe stdin

我正在使用gdb

我通过将输入发送到stdin:

来运行如下命令来设置程序

r < <(python -c "print '1\n2\n3'")

我希望该命令允许我在完成后开始输入输入(因此我可以正常与debugee交互)而不是stdin被关闭。

这可以在bash中运行,但是你不能以这种方式管道到gdb r命令:

cat <(python -c "print '1\n2\n3'") - | r

以下不起作用,我假设它在将EOF发送到程序之前等待EOF。

r < <(cat <(python -c "print '1\n2\n3'") -)

是否有第三种选择可行?

1 个答案:

答案 0 :(得分:2)

这听起来像是expect的工作。

鉴于

#include <stdio.h>

int main()
{
  char *cp = NULL;
  size_t n = 0;


  while(getline(&cp, &n, stdin) >= 0) {
    fprintf(stderr, "got: %s", cp);
  }

  return 0;
}

gcc -g -Wall t.c

这个期望脚本:

#!/usr/bin/expect

spawn gdb -q ./a.out

send run\n
send 1\n2\n3\n

interact

这是会议:

$ ./t.exp
spawn gdb -q ./a.out
run
1
2
3
Reading symbols from ./a.out...done.
(gdb) run
Starting program: /tmp/a.out
got: 1
got: 2
got: 3

现在脚本正在等待我的输入。我提供了一些:

foo bar baz
got: foo bar baz

我也可以与GDB互动:

^C
Program received signal SIGINT, Interrupt.
0x00007ffff7b006b0 in __read_nocancel () at ../sysdeps/unix/syscall-template.S:81
81  ../sysdeps/unix/syscall-template.S: No such file or directory.
(gdb) bt
#0  0x00007ffff7b006b0 in __read_nocancel () at ../sysdeps/unix/syscall-template.S:81
#1  0x00007ffff7a8f5a0 in _IO_new_file_underflow (fp=0x7ffff7dd4640 <_IO_2_1_stdin_>) at fileops.c:613
#2  0x00007ffff7a840d5 in _IO_getdelim (lineptr=0x7fffffffdda0, n=0x7fffffffdda8, delimiter=10, fp=0x7ffff7dd4640 <_IO_2_1_stdin_>) at iogetdelim.c:77
#3  0x000000000040064e in main () at t.c:9