15
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

pythonのデバッガを任意のタイミングで呼び出す

Posted at

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やディストリビューション、インストール方法によって異なるので、その点は適時読み替えてください。

15
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?