PythonコードのデバッグTips(1)

目的

エラー(例外)が発生した時、自動的にデバッガ「pdb」を起動して、 その時点のスタックフレームや上流階層に逆上って状況の確認がしたい!

でも止めたい箇所が分散していていちいちブレークポイント貼ったりステップ実行とかしてらんない!

みたいな状況で役に立つデバッグ手法です。

準備

以下をdebug.pyとして保存しましょう。:

 1 import sys
 2 
 3 def hook(type, value, tb):
 4    if hasattr(sys, 'ps1') or not sys.stderr.isatty():
 5       sys.__excepthook__(type, value, tb)
 6    else:
 7       import traceback, pdb
 8       traceback.print_exception(type, value, tb)
 9       print()
10       pdb.pm()
11 
12 sys.excepthook = hook

組み込み

開発中のコードの先頭で「import debug」としておきます。

実行

デバッグ対象のコードを実行します。

以下のようなmain.pyがあったら、

1 import debug
2 
3 raise Exception()

コンソールで「python main.py」というように起動しましょう。

結果

$ python main.py
Traceback (most recent call last):
  File "main.py", line 3, in <module>
    raise Exception()
Exception

> /Users/nobo/Dropbox/Tips/main.py(3)<module>()
-> raise Exception()
(Pdb)

エラーが起こった時点でコンソールでデバッガが起動します。 あとは、pdbの機能で問題点を探してみましょう。

利点

Python標準の機能だけを使ってるので、環境や予めインストールするモジュールなどがありません。

Webアプリなどはいろんな情報が詰まったコンテキストコンテナが深い関数ネストで渡っていくので、 コンテナの生成から順番に追っかけるより、エラー発生時点から逆上って行くほうが早く問題の発見ができます。 もちろんGUIアプリのデバッグなどにも使えますよ!

結論

低い確率で発生するトラブルシューティングにオススメのデバッグ手法です。 リリースするとき、消すのを忘れずにねー。