Pythonを使用してgdbのラッパーを開発しています。基本的に、毎回覚えなければならない巨大な文字列ではなく、事前にいくつかのセットアップの煩わしさを検出し、単一のコマンドを実行して gdb を呼び出すことができるようにしたいだけです。
とはいえ、私が使用しているケースは2つあります。正常に動作する最初の方法は、新しいプロセスを作成してそれにアタッチすることによって gdb を呼び出すことです。これが私が持っているコードです:
def spawnNewProcessInGDB():
global gObjDir, gGDBProcess;
from subprocess import Popen
from os.path import join
import subprocess
binLoc = join(gObjDir, 'dist');
binLoc = join(binLoc, 'bin');
binLoc = join(binLoc, 'mycommand')
profileDir = join(gObjDir, '..')
profileDir = join(profileDir, 'trash-profile')
try:
gGDBProcess = Popen(['gdb', '--args', binLoc, '-profile', profileDir], cwd=gObjDir)
gGDBProcess.wait()
except KeyboardInterrupt:
# Send a termination signal to the GDB process, if it's running
promptAndTerminate(gGDBProcess)
現在、これが実行中にユーザーが押すCTRL-C
と、壊れます (つまり、CTRL-C を GDB に転送します)。これは私が望む動作です。
2 番目のケースはもう少し複雑です。私のシステムで既にこのプログラムを実行していて、クラッシュしたのに捕まってしまったのかもしれません。この場合、スタック トレースを取得するために gdb を使用して接続できるようにしたいと考えています (または、既に実行していて、既にメモリ内にあるプロセスに接続したいだけかもしれません)。
便利な機能として、gdb を使用して実行中のプロセスに接続するミラー関数を作成しました。
def connectToProcess(procNum):
global gObjDir, gGDBProcess
from subprocess import Popen
import subprocess
import signal
print("Connecting to mycommand process number " + str(procNum) + "...")
try:
gGDBProcess = Popen(['gdb', '-p', procNum], cwd=gObjDir)
gGDBProcess.wait()
except KeyboardInterrupt:
promptAndTerminate(gGDBProcess)
繰り返しますが、これは期待どおりに機能するようです。CTRL-C
gdbが起動し、ブレークポイントを設定したり、プログラムを実行したりできます。唯一の問題は、プログラムの実行中に押すとgdbに転送されないことです。代わりに、すぐに にジャンプしpromptAndTerminate()
ます。
なぜこれが起こっているのか誰かがわかるかどうか疑問に思っていますsubprocess.Popen()
.1つは別のモードでgdbを実行していますが、2つの呼び出しは同じように見えます。
subprocess.Popen()
また、呼び出しを次のように置き換えてみました。
gGDBProcess = Popen(['gdb', '-p', procNum], cwd=gObjDir, stdin=subprocess.PIPE)
しかし、これは望ましくない結果にもつながります。これは、子 gdb プロセスに実際には何も通信しないためです (たとえば、c
gdb からの接続時にプログラムが切断された後にプログラムの実行を再開するために入力しても、何もしません)。 . 繰り返しますが、入力すると、実行中の python プロセスが終了しますCTRL-C
。
どんな助けでも大歓迎です!