#
24 Pythonデバッガ

モジュール`pdb`はPythonプログラム用の対話的ソースコードデバッガを定義します。(条件付き)ブレークポイントの設定やソース行レベルでのシングルステップ実行、スタックフレームのインスペクション、ソースコードリスティングおよびいかなるスタックフレームのコンテキストにおける任意のPythonコードの評価をサポートしています。事後解析デバッギングもサポートし、プログラムの制御下で呼び出すことができます。

デバッガは拡張可能です -- 実際にはクラス`Pdb` として定義されています。現在これについてのドキュメントはありませんが、ソースを読めば簡単に理解できます。拡張インターフェースはモジュール`bdb`(ドキュメントなし)と`cmd` を使っています。

デバッガのプロンプトは"`(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 -m pdb myscript.py

スクリプトとして pdb を起動すると、デバッグ中のプログラムが異常終了した 時に pdb が自動的に検死デバッグモードに入ります。検死デバッグ後 (またはプログラムの正常終了後) には、pdb はプログラムを再起動します。 自動再起動を行った場合、 pdb の状態 (ブレークポイントなど) は そのまま維持されるので、たいていの場合、プログラム終了時に デバッガも終了させるよりも便利なはずです。 バージョン 2.4 で 新たに追加 された仕様: 検死デバッグ後の再起動機能が追加されました

クラッシュしたプログラムを調べるための典型的な使い方は:

    >>> import pdb
    >>> import mymodule
    >>> mymodule.test()
    Traceback (most recent call 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]])

  デバッガに制御された状態で(文字列として与えられた)statementを実行します。デバッガプロンプトはあらゆるコードが実行される前に現れます。ブレークポイントを設定し、"`continue`"とタイプできます。あるいは、文を"`step`"や"`next`"を使って一つづつ実行することができます(これらのコマンドはすべて下で説明します)。オプションのglobalsとlocals引数はコードを実行する環境を指定します。デフォルトでは、モジュール`__main__`の辞書が使われます。(`exec`文または`eval()`組み込み関数の説明を参照してください。)

`runeval`( | expression[, globals[, locals]])

  デバッガの制御もとで(文字列として与えられる)expressionを評価します。`runeval()`がリターンしたとき、式の値を返します。その他の点では、この関数は`run()`を同様です。

`runcall`( | function[, argument, ...])

  function(関数またはメソッドオブジェクト、文字列ではありません)を与えられた引数とともに呼び出します。`runcall()`がリターンしたとき、関数呼び出しが返したものは何でも返します。デバッガプロンプトは関数に入るとすぐに現れます。

`set_trace`( | )

  スタックフレームを呼び出したところでデバッガに入ります。たとえコードが別の方法でデバッグされている最中でなくても(例えば、アサーションが失敗するとき)、これはプログラムの所定の場所でブレークポイントをハードコードするために役に立ちます。

`post_mortem`( | traceback)

  与えられたtracebackオブジェクトの事後解析デバッギングに入ります。

`pm`( | )

  `sys.last_traceback`のトレースバックの事後解析デバッギングに入ります。