2017-10-01 6 views
1

は、私は次の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を、私が望むものを、デバッガgdbfoobarを検査することです。私はその後、私は期待していた

>./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ので停止できるように

+0

あなたは 'p.stdin.write( "Fする\ n" .encodeを())'送信する必要があります。あるいは 'p.stdin.close()'。それはうまくいくはずです。 –

+0

@ Jean-FrançoisFabreまあ、それは浮気です...私はそれをすることはできません。私は 'foobar.py'と' foobar.c'というプログラムを用意しており、上記のように動作します。したがって、デバッガの下でも動作するはずです。私は 'sys.stdin.read(1)'を "stop"に挿入してデバッガをアタッチすることができます。私は周りを回り、他のものを変えることはできません。つまり、コードを変更しないで、 "print"文を挿入するのではなく、デバッガを使うのがポイントです。上記のコードは単なるSSCCEですが、わかりますか? 「本当の」コードははるかに大きくなります。 –

+0

それはそうではありません: 'scanf'はchar + linefeedを期待しています。したがって、それらの両方を.pyと.cコードで動作させることはできません。 'scanf'が入力を処理する方法のために、あなたは誰でもこの仕事をすることはできません。 –

答えて

1

どのようにそれを行うには?それはgdb attach pid -ex ...正確な意味が何であるかは明らかではありません


gdbがpid -ex = '12のb foobar.c' を添付してください。

下位プロセス(それに付随する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はちょうどここに座っています。私はfoobar.pyウィンドウでEnterを襲った後:

Breakpoint 1, main() at foobar.c:12 
12  printf("received char %c\n", c); 
+0

"続行するのを忘れましたか?" - すでにプロセスが実行されていたので、 "停止"していない、gdbが実行中に接続することで停止するのか? –

+0

'(gdb)'プロンプトが表示された場合、下位プロセス*は停止しています*(少なくともデフォルトの 'all-stop'モードでは)。そしてyes、 'gdb -ex" attach ... "は、attach-toプロセスを直ちに停止します。 –

+0

ありがとうございます!それは私が気づいていない、私は '-ex continue'が必要でした。以前は、私は 'continue'を使っていましたが、全部が止まったままで、何か間違っていたに違いありません。さて、私はそれをやって "何とか"それは動作します。 –

関連する問題