27.3。 pdb —Pythonデバッガー
ソースコード: :source: `Lib / pdb.py`
モジュール 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)
バージョン3.3で変更: readline モジュールを介したタブ補完は、コマンドおよびコマンド引数で使用できます。 現在のグローバル名とローカル名は、p
コマンドの引数として提供されます。
pdb.py
は、他のスクリプトをデバッグするためのスクリプトとして呼び出すこともできます。 例えば:
python3 -m pdb myscript.py
スクリプトとして呼び出されると、デバッグ中のプログラムが異常終了した場合、pdbは自動的に事後デバッグに入ります。 事後デバッグ後(またはプログラムの通常の終了後)、pdbはプログラムを再起動します。 自動再起動はpdbの状態(ブレークポイントなど)を保持し、ほとんどの場合、プログラムの終了時にデバッガーを終了するよりも便利です。
バージョン3.2の新機能: pdb.py
は、.pdbrc
ファイルで指定されているかのようにコマンドを実行する-c
オプションを受け入れるようになりました。デバッガコマンド[ X151X]。
実行中のプログラムからデバッガーに侵入する一般的な使用法は、挿入することです。
import pdb; pdb.set_trace()
デバッガーに侵入したい場所で。 次に、このステートメントに続くコードをステップ実行し、:pdbcmd: `continue` コマンドを使用して、デバッガーなしで実行を続行できます。
クラッシュしたプログラムを検査する一般的な使用法は次のとおりです。
>>> import pdb
>>> import mymodule
>>> mymodule.test()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
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)
このモジュールは、次の関数を定義します。 それぞれがわずかに異なる方法でデバッガーに入ります。
- pdb.run(statement, globals=None, locals=None)
- デバッガーの制御下でステートメント(文字列またはコードオブジェクトとして指定)を実行します。 コードが実行される前に、デバッガプロンプトが表示されます。 ブレークポイントを設定して:pdbcmd: `continue` と入力するか、:pdbcmd:` step` または:pdbcmd: `next` [を使用してステートメントをステップ実行できます。 X208X](これらのコマンドはすべて以下で説明します)。 オプションの globals および locals 引数は、コードが実行される環境を指定します。 デフォルトでは、モジュール __ main __ の辞書が使用されます。 (組み込みの exec()または eval()関数の説明を参照してください。)
- pdb.runeval(expression, globals=None, locals=None)
- デバッガーの制御下で式(文字列またはコードオブジェクトとして指定)を評価します。 runeval()が戻ると、式の値を返します。 それ以外の点では、この関数は run()に似ています。
- pdb.runcall(function, *args, **kwds)
- 指定された引数を使用して、 function (文字列ではなく関数またはメソッドオブジェクト)を呼び出します。 runcall()が戻ると、関数呼び出しが返したものは何でも返します。 関数が入力されるとすぐにデバッガプロンプトが表示されます。
- pdb.set_trace()
- 呼び出し元のスタックフレームでデバッガーに入ります。 これは、コードが他の方法でデバッグされていない場合でも、プログラムの特定のポイントにブレークポイントをハードコーディングするのに役立ちます(例: アサーションが失敗したとき)。
- pdb.post_mortem(traceback=None)
- 指定された traceback オブジェクトの事後デバッグを入力します。 traceback が指定されていない場合は、現在処理されている例外の1つを使用します(デフォルトを使用する場合は、例外を処理する必要があります)。
- pdb.pm()
- sys.last_traceback にあるトレースバックの事後デバッグを入力します。
run*
関数と set_trace()は、 Pdb クラスをインスタンス化し、同じ名前のメソッドを呼び出すためのエイリアスです。 さらに機能にアクセスしたい場合は、自分でこれを行う必要があります。
- class pdb.Pdb(completekey='tab', stdin=None, stdout=None, skip=None, nosigint=False, readrc=True)
Pdb はデバッガークラスです。
completekey 、 stdin 、および stdout 引数は、基になる cmd.Cmd クラスに渡されます。 そこの説明を参照してください。
skip 引数を指定する場合は、globスタイルのモジュール名パターンを反復可能にする必要があります。 デバッガーは、これらのパターンの1つに一致するモジュールで発生するフレームにステップインしません。 1
デフォルトでは、
continue
コマンドを実行すると、PdbはSIGINTシグナル(ユーザーがコンソールで Ctrl-C を押したときに送信される)のハンドラーを設定します。 これにより、 Ctrl-C を押すことで、デバッガーに再び侵入できます。 PdbがSIGINTハンドラーに触れないようにする場合は、 nosigint をtrueに設定します。readrc 引数はデフォルトでtrueに設定され、Pdbがファイルシステムから.pdbrcファイルをロードするかどうかを制御します。
skip を使用したトレースを有効にする呼び出しの例:
import pdb; pdb.Pdb(skip=['django.*']).set_trace()
バージョン3.1の新機能: skip 引数。
バージョン3.2の新機能: nosigint 引数。 以前は、SIGINTハンドラーがPdbによって設定されることはありませんでした。
バージョン3.6で変更: readrc 引数。
- run(statement, globals=None, locals=None)
runeval(expression, globals=None, locals=None)
runcall(function, *args, **kwds)
set_trace() 上記で説明した機能については、ドキュメントを参照してください。
- run(statement, globals=None, locals=None)
27.3.1。 デバッガコマンド
デバッガーで認識されるコマンドは以下のとおりです。 ほとんどのコマンドは、示されているように1文字または2文字に省略できます。 例えば h(elp)
は、h
またはhelp
のいずれかを使用してヘルプコマンドを入力できることを意味します(ただし、he
またはhel
、H
またはHelp
またはHELP
)。 コマンドの引数は、空白(スペースまたはタブ)で区切る必要があります。 コマンド構文では、オプションの引数を角かっこ([]
)で囲みます。 角かっこは入力しないでください。 コマンド構文の選択肢は、縦棒(|
)で区切られています。
空白行を入力すると、最後に入力したコマンドが繰り返されます。 例外:最後のコマンドが:pdbcmd: `list` コマンドの場合、次の11行がリストされます。
デバッガーが認識しないコマンドはPythonステートメントであると見なされ、デバッグ中のプログラムのコンテキストで実行されます。 Pythonステートメントの前に感嘆符(!
)を付けることもできます。 これは、デバッグ中のプログラムを検査するための強力な方法です。 変数を変更したり、関数を呼び出したりすることも可能です。 このようなステートメントで例外が発生すると、例外名が出力されますが、デバッガーの状態は変更されません。
デバッガーはエイリアスをサポートします。 エイリアスには、調査中のコンテキストへの特定のレベルの適応性を可能にするパラメータを含めることができます。
;;
で区切って、1行に複数のコマンドを入力できます。 (単一の;
は、Pythonパーサーに渡される行内の複数のコマンドの区切り文字であるため、使用されません。)コマンドの区切りにはインテリジェンスは適用されません。 入力は、引用符で囲まれた文字列の途中であっても、最初の;;
ペアで分割されます。
ファイル.pdbrc
がユーザーのホームディレクトリまたは現在のディレクトリに存在する場合、デバッガプロンプトで入力されたかのように読み込まれ、実行されます。 これは、エイリアスに特に役立ちます。 両方のファイルが存在する場合、ホームディレクトリ内のファイルが最初に読み取られ、そこで定義されたエイリアスをローカルファイルで上書きできます。
バージョン3.2での変更: .pdbrc
には、:pdbcmd: `continue` や:pdbcmd:` next` [などのデバッグを続行するコマンドを含めることができるようになりました。 X150X]。 以前は、これらのコマンドは効果がありませんでした。
脚注
- 1
- フレームが特定のモジュールで発生したと見なされるかどうかは、フレームグローバルの
__name__
によって決定されます。