如何将gdb附加到从Python脚本启动的子进程?

时间:2017-10-01 15:15:51

标签: python gdb

我有以下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

1 个答案:

答案 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);