我有以下Python 3脚本
foobar.py
:
#!/usr/bin/python3
import subprocess
import sys
p = subprocess.Popen(["./foobar"], stdin=subprocess.PIPE, shell=False)
sys.stdin.read(1)
p.stdin.write("f".encode())
p.stdin.flush()
sys.stdin.read(1)
启动使用foobar
选项从以下文件foobar.c
编译的程序-g
:
foobar.c
:
#include <stdio.h>
#include <stdlib.h>
int main() {
char c;
if (EOF == scanf("%c", &c)) {
perror(NULL);
exit(1);
}
printf("received char %c\n", c);
return(0);
}
我启动脚本,它等待我输入一个字符,我点击Enter
,然后我得到f
:
>./foobar.py
received char f
好的,我想要的是用调试器foobar
检查gdb
。这就是sys.stdin.read(1)
的用途:我希望开始
>./foobar.py
然后,在另一个终端中,找出foobar
的进程ID,然后运行
>gdb attach
{PID {1}}
然后我希望像以前一样在第一个终端中点击-ex='b foobar.c:12'
,然后C程序会吃掉输入并按照要求停在第12行,即Enter
。
但它没有这种方式 - 我点击printf
没有任何反应,程序Enter
没有让步,它仍然等待foobar
。
怎么做才能让我停在scanf
?
答案 0 :(得分:1)
怎么做才能让我停在printf上? gdb attach
pid
-ex ='b foobar.c:12'
目前尚不清楚gdb attach pid -ex ...
的确切含义是什么。
您是否忘记继续下级流程(由GDB附加到它上面停止)?
这对我来说非常好:
$ gdb -q -ex "attach $(pidof foobar)" -ex 'break foobar.c:12' -ex continue
Attaching to process 88748
Reading symbols from /tmp/stdin/foobar...done.
0x00007f9b78811330 in __read_nocancel () at ../sysdeps/unix/syscall-template.S:81
81 ../sysdeps/unix/syscall-template.S: No such file or directory.
Breakpoint 1 at 0x400664: file foobar.c, line 12.
Continuing.
...... GDB就在这里(正如预期的那样)。在Enter
窗口中点击foobar.py
之后:
Breakpoint 1, main () at foobar.c:12
12 printf("received char %c\n", c);