Pythonのコードを書いていて、あるタイミングでデバッガを呼び出したいことはよくあります。あらかじめ呼び出したい状況が決まっていれば、単純にpdbでブレークポイントを指定したり、コード中に"import pdb; pdb.set_trace()"を埋め込むことで対応できますが、完全な「任意」のタイミングとなるとそうもいきません。
gdbでいう、実行中のプロセスにattachするようなことができないかと調べたところ、StackOverflowにエレガントな方法があったので、ここに記録しておきます。
python - Attaching a process with pdb - Stack Overflow
import signal
def handle_pdb(sig, frame):
import pdb
pdb.Pdb().set_trace(frame)
if __name__ == '__main__':
signal.signal(signal.SIGUSR1, handle_pdb)
やっていることは、シグナルSIGUSR1が呼び出された時にpdbを呼び出す、というシンプルな内容です。既にSIGUSR1を他の用途に使っていない限り使えます。利用可能な他のシグナルを使ってもよいです。
cf. gdbを直接使う
今時のgdbにはpythonが統合されており、高度な操作ができるようになっています。実行しているpythonのデバッグシンボルがあれば、直接gdbでattachしてpythonレベルでのソースコードをトレースするという手段も可能だと思います。
2013年に大統一Debian勉強会で野島さんが発表された資料が参考になります。こちらではphpのソースレベルデバッグを行っています。
デバッグシンボルの扱いはOSやディストリビューション、インストール方法によって異なるので、その点は適時読み替えてください。