bdb --- デバッガーフレームワーク¶
ソースコード: Lib/bdb.py
bdb モジュールは、ブレークポイントの設定やデバッガーを通じた実行の管理など、デバッガーの基本的な機能を扱います。
以下の例外が定義されています:
bdb モジュールは、次の 2 つのクラスも定義しています。
- class bdb.Breakpoint(self, file, line, temporary=False, cond=None, funcname=None)¶
このクラスはテンポラリブレークポイント、無視するカウント、無効化と再有効化、条件付きブレークポイントを実装しています。
ブレークポイントは
bpbynumberというリストでは番号を使って、bplistでは(file, line)の組を使って参照します。 前者では一つのBreakpointインスタンスが得られます。 同じ行に複数のブレークポイントを設定できるため、後者ではインスタンスのリストが得られます。ブレークポイントを作るとき、関連付けられる
ファイル名は正規化されていなければなりません。funcnameが定義されると、ブレークポイントのヒットはその関数の最初の行が実行されたときにカウントされます。条件付きブレークポイントは毎回ヒットをカウントします。Breakpointインスタンスは以下のメソッドを持ちます:- deleteMe()¶
このブレークポイントをファイル/行に関連付けられたリストから削除します。このブレークポイントがその行に設定された最後のブレークポイントだった場合、そのファイル/行に対するエントリ自体を削除します。
- enable()¶
このブレークポイントを有効にします。
- disable()¶
このブレークポイントを無効にします。
- bpformat()¶
ブレークポイントに関する情報を持つ文字列をフォーマットして返します:
ブレークポイントの番号。
一時的なブレークポイントかどうか (del または keep)。
ファイルと行の位置。
停止する条件。
無視する回数。
ヒットした回数。
Added in version 3.2.
- bpprint(out=None)¶
ファイル out に、またはそれが
Noneの場合は標準出力に、bpformat()の出力を表示する。
Breakpointインスタンスは以下の属性を持ちます:- file¶
Breakpointのファイル名です。
- line¶
file内でのBreakpointの行番号です。
- temporary¶
(file, line)のBreakpointが一時的なものであればTrueです。
- cond¶
(file, line)のBreakpointを評価する条件です。
- funcname¶
関数に入ったときに
Breakpointにヒットするかどうかを決める関数名です。
- enabled¶
Breakpointが有効ならTrueです。
- bpbynumber¶
Numeric index for a single instance of a
Breakpoint.
- bplist¶
Dictionary of
Breakpointinstances indexed by (file,line) tuples.
- ignore¶
Breakpointを無視する回数です。
- hits¶
Breakpointにヒットした回数です。
- class bdb.Bdb(skip=None, backend='settrace')¶
Bdbクラスは一般的なPythonデバッガーの基本クラスとして振舞います。このクラスはトレース機能の詳細を扱います。ユーザーとのインタラクションは、派生クラスが実装するべきです。標準ライブラリのデバッガクラス (
pdb.Pdb) がその利用例です。skip 引数は、もし与えられたならグロブ形式のモジュール名パターンの iterable でなければなりません。デバッガはこれらのパターンのどれかにマッチするモジュールで発生したフレームにステップインしなくなります。フレームが特定のモジュールで発生したかどうかは、フレームのグローバル変数の
__name__によって決定されます。backend 引数は
Bdbが使うバックエンドを指定します。'settrace'または'monitoring'を指定できます。'settrace'はsys.settrace()を使い、後方互換性が最も高いバックエンドです。'monitoring'は Python 3.12 で導入されたsys.monitoringを使います。 使わないイベントを無効にできるため、大幅に効率がよくなる場合があります。 両方のバックエンドで同一のインターフェースを保つようにしていますが、いくつか違いがあります。 性能を高めるため、デバッガーの開発者には'monitoring'バックエンドの使用を推奨します。バージョン 3.1 で変更: skip パラメータが追加されました。
バージョン 3.14 で変更: backend パラメーターが追加されました。
以下の
Bdbのメソッドは、通常オーバーライドする必要はありません。- canonic(filename)¶
filename を正規化した形式で返します。
実際のファイル名では、正規化された形式とは、OS に応じて
大文字・小文字を正規化した絶対パスです。 対話モードで生成される"<stdin>"のように山括弧で囲まれた filename は、そのまま返します。
- start_trace(self)¶
トレースを開始します。
'settrace'バックエンドでは、sys.settrace(self.trace_dispatch)と同じです。Added in version 3.14.
- stop_trace(self)¶
トレースを停止します。
'settrace'バックエンドでは、sys.settrace(None)と同じです。Added in version 3.14.
- trace_dispatch(frame, event, arg)¶
この関数は、デバッグされているフレームのトレース関数としてインストールされます。戻り値は新しいトレース関数(殆どの場合はこの関数自身)です。
デフォルトの実装は、実行しようとしている event (文字列として渡されます) の種類に基づいてフレームのディスパッチ方法を決定します。event は次のうちのどれかです:
"line": 新しい行を実行しようとしています。"call": 関数が呼び出されているか、別のコードブロックに入ります。"return": 関数か別のコードブロックからreturnしようとしています。"exception": 例外が発生しました。
各イベントに対応する専用の関数 (後述) を呼び出します。
arg 引数は以前のイベントに依存します。
トレース関数についてのより詳しい情報は、
sys.settrace()のドキュメントを参照してください。コードとフレームオブジェクトについてのより詳しい情報は、 標準型の階層 を参照してください。
- dispatch_line(frame)¶
デバッガーが現在の行で停止するべきなら、
user_line()メソッドを呼び出します (サブクラスでオーバーライドしてください)。quittingフラグが設定されていればBdbQuitを送出します (このフラグはuser_line()から設定できます)。 そのスコープ内のトレースを続けるために、trace_dispatch()メソッドへの参照を返します。
- dispatch_call(frame, arg)¶
デバッガーがこの関数呼び出しで停止するべきなら、
user_call()メソッドを呼び出します (サブクラスでオーバーライドしてください)。quittingフラグが設定されていればBdbQuitを送出します (このフラグはuser_call()から設定できます)。 そのスコープ内のトレースを続けるために、trace_dispatch()メソッドへの参照を返します。
- dispatch_return(frame, arg)¶
デバッガーがこの関数からのリターンで停止するべきなら、
user_return()メソッドを呼び出します (サブクラスでオーバーライドしてください)。quittingフラグが設定されていればBdbQuitを送出します (このフラグはuser_return()から設定できます)。 そのスコープ内のトレースを続けるために、trace_dispatch()メソッドへの参照を返します。
- dispatch_exception(frame, arg)¶
デバッガーがこの例外で停止するべきなら、
user_exception()メソッドを呼び出します (サブクラスでオーバーライドしてください)。quittingフラグが設定されていればBdbQuitを送出します (このフラグはuser_exception()から設定できます)。 そのスコープ内のトレースを続けるために、trace_dispatch()メソッドへの参照を返します。
通常、継承クラスは以下のメソッド群をオーバーライドしません。しかし、停止やブレークポイント機能を再定義したい場合には、オーバーライドすることもあります。
- is_skipped_module(module_name)¶
module_name がいずれかのスキップパターンにマッチすれば
Trueを返します。
- stop_here(frame)¶
Return
Trueif frame is below the starting frame in the stack.
- break_here(frame)¶
この行に実際に停止するブレークポイントがあれば
Trueを返します。行または関数のブレークポイントが存在し、実際に停止するかどうかを確認します。
effective()の情報に基づいて、一時的なブレークポイントを削除します。
- break_anywhere(frame)¶
frame のファイル名に対してブレークポイントが 1 つでもあれば
Trueを返します。
継承クラスはデバッガー操作をするために以下のメソッド群をオーバーライドするべきです。
- user_call(frame, argument_list)¶
呼び出された関数内で停止する可能性がある場合、
dispatch_call()から呼び出されます。argument_list は現在使われておらず、常に
Noneです。 後方互換性のために残されています。
- user_line(frame)¶
stop_here()かbreak_here()がTrueを返したときに、dispatch_line()から呼び出されます。
- user_return(frame, return_value)¶
stop_here()がTrueを返したときに、dispatch_return()から呼び出されます。
- user_exception(frame, exc_info)¶
stop_here()がTrueを返したときに、dispatch_exception()から呼び出されます。
- do_clear(arg)¶
ブレークポイントがテンポラリブレークポイントだったときに、それをどう削除するかを決定します。
継承クラスはこのメソッドを実装しなければなりません。
継承クラスとクライアントは、ステップ状態に影響を及ぼすために以下のメソッドを呼び出すことができます。
- set_step()¶
コードの次の行でストップします。
- set_next(frame)¶
与えられたフレームかそれより下(のフレーム)にある、次の行でストップします。
- set_return(frame)¶
指定されたフレームから抜けるときにストップします。
- set_until(frame, lineno=None)¶
現在の行番号よりも大きい lineno に到達したとき、あるいは、現在のフレームから戻るときにストップします。
- set_trace([frame])¶
frame からデバッグを開始します。frame が指定されなかった場合、デバッグは呼び出し元のフレームから開始します。
バージョン 3.13 で変更:
set_trace()は、次のコード行が実行されるときではなく、即座にデバッガーに入るようになりました。
- set_continue()¶
ブレークポイントに到達するか終了したときにストップします。もしブレークポイントが1つも無い場合、システムのトレース関数を
Noneに設定します。
継承クラスとクライアントは以下のメソッドをブレークポイント操作に利用できます。これらのメソッドは、何か悪いことがあればエラーメッセージを含む文字列を返し、すべてが順調であれば
Noneを返します。- set_break(filename, lineno, temporary=False, cond=None, funcname=None)¶
新しいブレークポイントを設定します。引数の lineno 行が filename に存在しない場合、エラーメッセージを返します。 filename は、
canonic()メソッドで説明されているような、標準形である必要があります。
- clear_break(filename, lineno)¶
filename の lineno 行にあるブレークポイントを削除します。もしブレークポイントが無かった場合、エラーメッセージを返します。
- clear_bpbynumber(arg)¶
Breakpoint.bpbynumberの中で arg のインデックスを持つブレークポイントを削除します。 arg が数値でないか範囲外の場合、エラーメッセージを返します。
- clear_all_file_breaks(filename)¶
filename にあるすべてのブレークポイントを削除します。もしブレークポイントが無かった場合、エラーメッセージを返します。
- clear_all_breaks()¶
存在するすべてのブレークポイントを削除します。もしブレークポイントが無かった場合、エラーメッセージを返します。
- get_bpbynumber(arg)¶
与えられた数値によって指定されるブレークポイントを返します。 arg が文字列なら数値に変換されます。 arg が非数値の文字列である場合、指定されたブレークポイントが存在しないか削除された場合、
ValueErrorが上げられます。Added in version 3.2.
- get_break(filename, lineno)¶
filename の lineno 行にブレークポイントがあれば
Trueを返します。
- get_breaks(filename, lineno)¶
filename の lineno にあるすべてのブレークポイントを返します。ブレークポイントが存在しない場合は空のリストを返します。
- get_file_breaks(filename)¶
filename の中のすべてのブレークポイントを返します。ブレークポイントが存在しない場合は空のリストを返します。
- get_all_breaks()¶
セットされているすべてのブレークポイントを返します。
派生クラスやクライアントは、次のメソッドでイベントを無効にしたり再開したりして、性能を高められます。 これらのメソッドが機能するのは
'monitoring'バックエンドを使う場合だけです。- disable_current_event()¶
次に
restart_events()が呼び出されるまで、現在のイベントを無効にします。 デバッガーが現在の行を調べる必要がない場合に役立ちます。Added in version 3.14.
- restart_events()¶
無効にしたすべてのイベントを再開します。 この関数は
dispatch_*メソッド内で、user_*メソッドの呼び出し後に自動的に呼び出されます。dispatch_*メソッドをオーバーライドしていなければ、ユーザーとのやりとりのたびに、無効にしたイベントが再開されます。Added in version 3.14.
継承クラスとクライアントは以下のメソッドを呼んでスタックトレースを表現するデータ構造を取得することができます。
- get_stack(f, t)¶
Return a list of (frame, lineno) tuples in a stack trace, and a size.
The most recently called frame is last in the list. The size is the number of frames below the frame where the debugger was invoked.
- format_stack_entry(frame_lineno, lprefix=': ')¶
スタックのエントリーを表す
(frame, lineno)タプルについての情報を文字列で返します。 返す文字列には次の情報を含みます。フレームを含むファイルの正規化された名前。
関数名もしくは
"<lambda>"。入力された引数。
戻り値。
(あれば)その行のコード。
以下の2つのメソッドは、文字列として渡された 文 をデバッグするもので、クライアントから利用されます。
- run(cmd, globals=None, locals=None)¶
exec()関数で実行する文をデバッグします。 globals のデフォルトは__main__.__dict__、locals のデフォルトは globals です。
- runeval(expr, globals=None, locals=None)¶
eval()関数を利用して式を実行しデバッグします。 globals と locals はrun()と同じ意味です。
- runcall(func, /, *args, **kwds)¶
1つの関数呼び出しをデバッグし、その結果を返します。
最後に、このモジュールは以下の関数を提供しています:
- bdb.checkfuncname(b, frame)¶
Breakpointb の設定に基づき、この位置で停止するべきならTrueを返します。行番号で設定されたブレークポイントでは、
b.lineと frame の行番号が同じかどうかを確認します。関数名で設定された場合は、正しい frame (正しい関数) 内にいて、その関数の最初の実行可能な行にいるかどうかを確認する必要があります。
- bdb.effective(file, line, frame)¶
停止に使うブレークポイントとして
(active breakpoint, delete temporary flag)、または(None, None)を返します。active breakpoint は、存在する (
file、line) に対応するbplistのうち、次の条件を満たす最初のエントリーです。有効で、checkfuncname()が真を返し、条件が偽ではなく、無視する回数が正でもないことが条件です。 一時的なブレークポイントを削除すべきことを表す flag がFalseになるのは、condを評価できない場合だけです (この場合、無視する回数は考慮しません)。該当するエントリーがなければ
(None, None)を返します。