26.2。 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)
pdb.py
は、他のスクリプトをデバッグするためのスクリプトとして呼び出すこともできます。 例えば:
python -m pdb myscript.py
スクリプトとして呼び出されると、デバッグ中のプログラムが異常終了した場合、pdbは自動的に事後デバッグに入ります。 事後デバッグ後(またはプログラムの通常の終了後)、pdbはプログラムを再起動します。 自動再起動はpdbの状態(ブレークポイントなど)を保持し、ほとんどの場合、プログラムの終了時にデバッガーを終了するよりも便利です。
バージョン2.4の新機能:事後動作の再開が追加されました。
実行中のプログラムからデバッガーに侵入する一般的な使用法は、挿入することです。
import pdb; pdb.set_trace()
デバッガーに侵入したい場所で。 次に、このステートメントに続くコードをステップ実行し、c
コマンドを使用して、デバッガーなしで実行を続行できます。
クラッシュしたプログラムを検査する一般的な使用法は次のとおりです。
>>> 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[, locals]])
- デバッガーの制御下でステートメント(文字列として指定)を実行します。 コードが実行される前に、デバッガプロンプトが表示されます。 ブレークポイントを設定して
continue
と入力するか、step
またはnext
を使用してステートメントをステップ実行できます(これらのコマンドはすべて以下で説明します)。 オプションの globals および locals 引数は、コードが実行される環境を指定します。 デフォルトでは、モジュール __ main __ の辞書が使用されます。 ( exec ステートメントまたは eval()組み込み関数の説明を参照してください。)
- pdb.runeval(expression[, globals[, locals]])
- デバッガーの制御下で式(文字列として指定)を評価します。 runeval()が戻ると、式の値を返します。 それ以外の点では、この関数は run()に似ています。
- pdb.runcall(function[, argument, ...])
- 指定された引数を使用して、 function (文字列ではなく関数またはメソッドオブジェクト)を呼び出します。 runcall()が戻ると、関数呼び出しが返したものは何でも返します。 関数が入力されるとすぐにデバッガプロンプトが表示されます。
- pdb.set_trace()
- 呼び出し元のスタックフレームでデバッガーに入ります。 これは、コードが他の方法でデバッグされていない場合でも、プログラムの特定のポイントにブレークポイントをハードコーディングするのに役立ちます(例: アサーションが失敗したとき)。
- pdb.post_mortem([traceback])
- 指定された traceback オブジェクトの事後デバッグを入力します。 traceback が指定されていない場合は、現在処理されている例外の1つを使用します(デフォルトを使用する場合は、例外を処理する必要があります)。
- pdb.pm()
- sys.last_traceback にあるトレースバックの事後デバッグを入力します。
run*
関数と set_trace()は、 Pdb クラスをインスタンス化し、同じ名前のメソッドを呼び出すためのエイリアスです。 さらに機能にアクセスしたい場合は、自分でこれを行う必要があります。
- class pdb.Pdb(completekey='tab', stdin=None, stdout=None, skip=None)
Pdb はデバッガークラスです。
completekey 、 stdin 、および stdout 引数は、基になる cmd.Cmd クラスに渡されます。 そこの説明を参照してください。
skip 引数を指定する場合は、globスタイルのモジュール名パターンを反復可能にする必要があります。 デバッガーは、これらのパターンの1つに一致するモジュールで発生するフレームにステップインしません。 1
skip を使用したトレースを有効にする呼び出しの例:
import pdb; pdb.Pdb(skip=['django.*']).set_trace()
バージョン2.7の新機能: skip 引数。
- run(statement[, globals[, locals]])
runeval(expression[, globals[, locals]])
runcall(function[, argument, ...])
set_trace() 上記で説明した機能については、ドキュメントを参照してください。
- run(statement[, globals[, locals]])
26.3。 デバッガコマンド
デバッガーは次のコマンドを認識します。 ほとんどのコマンドは、1文字または2文字に省略できます。 例えば h(elp)
は、h
またはhelp
のいずれかを使用してヘルプコマンドを入力できることを意味します(ただし、he
またはhel
、H
またはHelp
またはHELP
)。 コマンドの引数は、空白(スペースまたはタブ)で区切る必要があります。 コマンド構文では、オプションの引数を角かっこ([]
)で囲みます。 角かっこは入力しないでください。 コマンド構文の選択肢は、縦棒(|
)で区切られています。
空白行を入力すると、最後に入力したコマンドが繰り返されます。 例外:最後のコマンドがlist
コマンドの場合、次の11行がリストされます。
デバッガーが認識しないコマンドはPythonステートメントであると見なされ、デバッグ中のプログラムのコンテキストで実行されます。 Pythonステートメントの前に感嘆符(!
)を付けることもできます。 これは、デバッグ中のプログラムを検査するための強力な方法です。 変数を変更したり、関数を呼び出したりすることも可能です。 このようなステートメントで例外が発生すると、例外名が出力されますが、デバッガーの状態は変更されません。
;;
で区切って、1行に複数のコマンドを入力できます。 (単一の;
は、Pythonパーサーに渡される行内の複数のコマンドの区切り文字であるため、使用されません。)コマンドの区切りにはインテリジェンスは適用されません。 入力は、引用符で囲まれた文字列の途中であっても、最初の;;
ペアで分割されます。
デバッガーはエイリアスをサポートします。 エイリアスには、調査中のコンテキストへの特定のレベルの適応性を可能にするパラメータを含めることができます。
ファイル.pdbrc
がユーザーのホームディレクトリまたは現在のディレクトリに存在する場合、デバッガプロンプトで入力されたかのように読み込まれ、実行されます。 これは、エイリアスに特に役立ちます。 両方のファイルが存在する場合、ホームディレクトリ内のファイルが最初に読み取られ、そこで定義されたエイリアスをローカルファイルで上書きできます。
- h(elp)[コマンド]
引数なしで、使用可能なコマンドのリストを出力します。 コマンドを引数として、そのコマンドに関するヘルプを出力します。
help pdb
は、完全なドキュメントファイルを表示します。 環境変数PAGER
が定義されている場合、ファイルは代わりにそのコマンドを介してパイプされます。 コマンド引数は識別子である必要があるため、!
コマンドのヘルプを表示するには、help exec
を入力する必要があります。- どこ)
最新のフレームを一番下にして、スタックトレースを印刷します。 矢印は現在のフレームを示し、ほとんどのコマンドのコンテキストを決定します。
- 下)
現在のフレームをスタックトレースの1レベル下に移動します(新しいフレームに移動します)。
- 上)
現在のフレームをスタックトレースの1つ上のレベルに移動します(古いフレームに)。
- b(リーク)[[ファイル名:] lineno | 機能 [、状態]]
lineno 引数を使用して、現在のファイルにブレークを設定します。 function 引数を使用して、その関数内の最初の実行可能ステートメントにブレークを設定します。 別のファイル(おそらくまだロードされていないファイル)のブレークポイントを指定するために、行番号の前にファイル名とコロンを付けることができます。 ファイルは
sys.path
で検索されます。 各ブレークポイントには、他のすべてのブレークポイントコマンドが参照する番号が割り当てられていることに注意してください。2番目の引数が存在する場合、それはブレークポイントが受け入れられる前にtrueと評価される必要がある式です。
引数なしで、各ブレークポイント、ブレークポイントがヒットした回数、現在の無視カウント、および関連する条件(存在する場合)を含むすべてのブレークをリストします。
- tbreak [[ filename :] lineno | 機能 [、状態]]
一時的なブレークポイント。最初にヒットしたときに自動的に削除されます。 引数はbreakと同じです。
- cl(ear)[ filename:lineno | bpnumber [ bpnumber…]]
filename:lineno 引数を使用して、この行のすべてのブレークポイントをクリアします。 スペースで区切られたブレークポイント番号のリストを使用して、それらのブレークポイントをクリアします。 引数なしで、すべての区切りをクリアします(ただし、最初に確認を求めます)。
- [ bpnumber [ bpnumber…]]を無効にします
ブレークポイント番号のスペース区切りリストとして指定されたブレークポイントを無効にします。 ブレークポイントを無効にすると、プログラムの実行を停止できなくなりますが、ブレークポイントをクリアするのとは異なり、ブレークポイントのリストに残り、(再)有効にすることができます。
- [ bpnumber [ bpnumber…]]を有効にします
指定されたブレークポイントを有効にします。
- bpnumber [ count ]を無視します
指定されたブレークポイント番号の無視カウントを設定します。 countを省略すると、無視カウントは0に設定されます。 無視カウントがゼロの場合、ブレークポイントがアクティブになります。 ゼロ以外の場合、ブレークポイントに到達するたびにカウントがデクリメントされ、ブレークポイントは無効にならず、関連する条件はすべてtrueと評価されます。
- 条件 bpnumber [条件]
条件は、ブレークポイントが適用される前にtrueと評価される必要がある式です。 条件がない場合、既存の条件はすべて削除されます。 つまり、ブレークポイントは無条件になります。
- コマンド[ bpnumber ]
ブレークポイント番号 bpnumber のコマンド一覧を指定してください。 コマンド自体は次の行に表示されます。 'end'だけを含む行を入力して、コマンドを終了します。 例:
(Pdb) commands 1 (com) print some_variable (com) end (Pdb)
ブレークポイントからすべてのコマンドを削除するには、commandsと入力し、すぐにendを続けます。 つまり、コマンドを与えないでください。
bpnumber 引数がない場合、コマンドは最後に設定されたブレークポイントを参照します。
ブレークポイントコマンドを使用して、プログラムを再起動できます。 単にcontinueコマンド、step、または実行を再開するその他のコマンドを使用します。
実行を再開するコマンド(現在、continue、step、next、return、jump、quit、およびそれらの省略形)を指定すると、コマンドリストが終了します(そのコマンドの直後にendが続くかのように)。 これは、実行を再開するたびに(単純な次またはステップでも)、別のブレークポイントが発生する可能性があるためです。このブレークポイントには独自のコマンドリストがあり、実行するリストがあいまいになる可能性があります。
コマンドリストで「silent」コマンドを使用すると、ブレークポイントでの停止に関する通常のメッセージは出力されません。 これは、特定のメッセージを出力して続行するブレークポイントに適している場合があります。 他のコマンドが何も出力しない場合は、ブレークポイントに到達したという兆候は見られません。
バージョン2.5の新機能。
- ステップ)
現在の行を実行し、最初の可能な機会に停止します(呼び出された関数または現在の関数の次の行のいずれかで)。
- 次)
現在の関数の次の行に到達するか、戻るまで実行を続けます。 (
next
とstep
の違いは、step
は呼び出された関数内で停止するのに対し、next
は呼び出された関数を(ほぼ)フルスピードで実行し、停止するだけです。現在の関数の次の行で。)- それまで)
行番号が現在の行よりも大きい行に到達するまで、または現在のフレームから戻るまで実行を続けます。
バージョン2.6の新機能。
- 戻る)
現在の関数が戻るまで実行を続けます。
- 継続する))
実行を続行し、ブレークポイントが検出された場合にのみ停止します。
- j(ump) lineno
実行される次の行を設定します。 一番下のフレームでのみ使用できます。 これにより、ジャンプしてコードを再度実行したり、前方にジャンプして実行したくないコードをスキップしたりできます。
すべてのジャンプが許可されているわけではないことに注意してください。たとえば、 for ループの途中や finally 句からジャンプすることはできません。
- l(ist)[ first [、 last ]]
現在のファイルのソースコードを一覧表示します。 引数なしで、現在の行の周りに11行をリストするか、前のリストを続けます。 1つの引数を使用して、その行の周りに11行をリストします。 2つの引数を使用して、指定された範囲をリストします。 2番目の引数が最初の引数よりも小さい場合、カウントとして解釈されます。
- a(rgs)
現在の関数の引数リストを出力します。
- p 式
現在のコンテキストで式を評価し、その値を出力します。
ノート
print
も使用できますが、デバッガーコマンドではありません。これにより、Python print ステートメントが実行されます。- pp 式
p
コマンドと同様ですが、式の値が pprint モジュールを使用してきれいに出力される点が異なります。- エイリアス[名前 [コマンド]]
コマンドを実行する name というエイリアスを作成します。 コマンドは引用符で囲む必要があります ' ではありません。 交換可能なパラメータは、
%1
、%2
などで指定できますが、%*
はすべてのパラメータで置き換えられます。 コマンドが指定されていない場合は、 name の現在のエイリアスが表示されます。 引数が指定されていない場合は、すべてのエイリアスが一覧表示されます。エイリアスはネストすることができ、pdbプロンプトで合法的に入力できるものなら何でも含めることができます。 内部pdbコマンドはエイリアスによってオーバーライドできることに注意してください。 このようなコマンドは、エイリアスが削除されるまで非表示になります。 エイリアシングは、コマンドラインの最初の単語に再帰的に適用されます。 行内の他のすべての単語はそのままになります。
例として、次の2つの便利なエイリアスがあります(特に
.pdbrc
ファイルに配置されている場合)。#Print instance variables (usage "pi classInst") alias pi for k in %1.__dict__.keys(): print "%1.",k,"=",%1.__dict__[k] #Print instance variables in self alias ps pi self
- unalias name
指定されたエイリアスを削除します。
- [!] ステートメント
現在のスタックフレームのコンテキストで(1行の)ステートメントを実行します。 ステートメントの最初の単語がデバッガーコマンドに似ていない限り、感嘆符は省略できます。 グローバル変数を設定するには、同じ行で割り当てコマンドの前に
global
コマンドを付けることができます。例:(Pdb) global list_options; list_options = ['-l'] (Pdb)
- [ args …]を実行します
デバッグされたPythonプログラムを再起動します。 引数が指定されている場合、それは「shlex」で分割され、結果が新しいsys.argvとして使用されます。 履歴、ブレークポイント、アクション、およびデバッガーオプションは保持されます。 「restart」は「run」のエイリアスです。
バージョン2.6の新機能。
- 終了する)
デバッガーを終了します。 実行中のプログラムは中止されます。
脚注
- 1
- フレームが特定のモジュールで発生したと見なされるかどうかは、フレームグローバルの
__name__
によって決定されます。