は、私は次のPython 3のスクリプトPythonスクリプトから起動されたサブプロセスにgdbを接続するには?
foobar.py
を持っている:
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);
}
-g
オプションを使用して、次のファイルfoobar.c
からコンパイルされたプログラムfoobar
を開始し
#!/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)
私が開始スクリプトは、それは私が文字を入力するのを待ち、私はEnter
を打つ、と私はf
を得る:
>./foobar.py
received char f
OKを、私が望むものを、デバッガgdb
とfoobar
を検査することです。私はその後、私は期待していた
>./foobar.py
を開始し、その後、別の端末では、foobar
のプロセスIDを見つけて、
>gdb attach
PID -ex='b foobar.c:12'
を実行することを望んだ:それはsys.stdin.read(1)
が何のためにあるのかであります以前と同じように最初の端末でEnter
を押すと、Cプログラムは入力を食い込み、要求された通りに12行目で停止します(printf
)。
しかし、これはうまくいかない - Enter
を押しても何も起こらず、プログラムfoobar
はまだ動かなくて、まだscanf
で待っている。
私はprintf
で止めることができますか?私はprintfので停止できるように
あなたは 'p.stdin.write( "Fする\ n" .encodeを())'送信する必要があります。あるいは 'p.stdin.close()'。それはうまくいくはずです。 –
@ Jean-FrançoisFabreまあ、それは浮気です...私はそれをすることはできません。私は 'foobar.py'と' foobar.c'というプログラムを用意しており、上記のように動作します。したがって、デバッガの下でも動作するはずです。私は 'sys.stdin.read(1)'を "stop"に挿入してデバッガをアタッチすることができます。私は周りを回り、他のものを変えることはできません。つまり、コードを変更しないで、 "print"文を挿入するのではなく、デバッガを使うのがポイントです。上記のコードは単なるSSCCEですが、わかりますか? 「本当の」コードははるかに大きくなります。 –
それはそうではありません: 'scanf'はchar + linefeedを期待しています。したがって、それらの両方を.pyと.cコードで動作させることはできません。 'scanf'が入力を処理する方法のために、あなたは誰でもこの仕事をすることはできません。 –