9. Pythonデバッガ

  

モジュール pdb は、Pyhtonプログラムのための対話型ソースコードデバッガを定義しています。 pdbはソースラインレベルでのでのブレークポイント設定(条件付き)と シングルステップ実行、スタックフレームの点検、ソースコードの列挙、 および任意のスタックフレームコンテキストでの任意のパイソンコードの評価をサポートしています。 また、pdbは検死(post-mortem)デバッグのサポートやプログラム制御下で呼び出すことができます。

デバッガは実際にクラスPdbとして定義され、拡張可能です。 Pdb.   これは現在文書化されていませんが、ソースを読むことで容易に理解できます。 拡張インターフェースは(同じく文書化されていない)モジュール bdb cmd を使用します。

また、ベーシックなウインドウを使用するデバッガのバージョンも存在します。 これはモジュールwdbです。そしてwdbはstdwinを必要とします。 (STDWINの特定モジュールの章を参照)   

デバッガのプロンプトは"(Pdb) "です。 デバッガの制御下においてプログラムが走る典型的な使用法は、

>>> import pdb
>>> import mymodule
>>> pdb.run('mymodule.test()')
> <string>(0)?()
(Pdb) continue
> <string>(1)?()
(Pdb) continue
NameError: 'spam'
> <string>(1)?()
(Pdb)

"pdb.py"は他のスクリプトをデバッグするために同じくスクリプトとして呼び出すことができます。 例えば、

python /usr/local/lib/python1.5/pdb.py myscript.py

クラッシュしたプログラムを点検する方法は

>>> import pdb
>>> import mymodule
>>> mymodule.test()
Traceback (innermost last):
  File "<stdin>", line 1, in ?
  File "./mymodule.py", line 4, in test
    test2()
  File "./mymodule.py", line 3, in test2
    print spam
NameError: spam
>>> pdb.pm()
> ./mymodule.py(3)test2()
-> print spam
(Pdb)

モジュールは次に述べる機能を定義します。 また、それぞれがわずかに異なった方法でデバッガに入ります。

run (statement[, globals[, locals]])
デバッガ制御下でステートメント (ストリングとして与えられた) を実行します。 デバッガのプロンプトはどんなコードでも実行さる前に現れます。 ブレークポイントを設定することができ、「continue」とタイプすることで あるいは、「step」「next」ステートメントを通してシングルステップ実行ができます。(コマンドは以下で説明) オプションのGloballocal引き数はコードがどの環境で実行されるかを指定します。 デフォルトではモジュール__main__の辞書が使用されます。 (「exec」ステートメントか「eval」組み込み関数の説明を参照して下さい。)

runeval (expression[, globals[, locals]])
expression(ストリングとして与えられた)をデバッガの制御下で評価します。 runeval()の戻り値は、expressionの値を返します。 その他の点ではこの関数は「run()」に類似しています。

runcall (function[, argument, ...])
与えられた引き数でそのfunction(文字列ではなく、機能またはメソッドオブジェクト)を呼び出します。 runcall()の戻り値は、その関数呼び出しで返されるものを何でも返します。 デバッカプロンプトはその関数に入ると同時に現れます。

set_trace ()
呼び出し中のスタックフレーム上でデバッガに入ります。 これは、プログラム中でブレークポイントとして与えにくい場合や、 他の方法でコードがデバッグされていないときに有効です。 (例えば、assertionが失敗した場合など)

post_mortem (traceback)
与えられたトレースバックオブジェクトの検死(post-mortem)デバックに入ります。

pm ()
「sys.last_traceback」中で見つけられたトレースバックの検死(post-mortem)デバックに入ります。


guido@python.org