前のトピックへ

27. デバッグとプロファイル

次のトピックへ

27.2. pdb — Python デバッガ

このページ

27.1. bdb — デバッガーフレームワーク

bdb モジュールは、テンポラリブレークポイントを設定したり、デバッガー経由で実行を管理するような、 基本的なデバッガー機能を提供します

以下の例外が定義されています。

exception bdb.BdbQuit

Bdb クラスが、デバッガーを終了させるために投げる例外。

bdb モジュールは2つのクラスを定義しています。

class bdb.Breakpoint(self, file, line[, temporary=0[, cond=None[, funcname=None]]])

このクラスはテンポラリブレークポイント、無視するカウント、無効化と再有効化、条件付き ブレークポイントを実装しています。

ブレークポイントは bpbynumber という名前のリストで番号によりインデックスされ、 bplist により (file, line) の形でインデックスされます。 bpbynumberBreakpoint クラスのインスタンスを指しています。 一方 bplist は、同じ行に複数のブレークポイントが設定される場合があるので、 インスタンスのリストを指しています。

ブレークポイントを作るとき、設定されるファイル名は正規化されていなければなりません。 funcname が設定されたとき、ブレークポイントはその関数の最初の行が実行されたときに ヒットカウントにカウントされます。 条件付ブレークポイントは毎回カウントされます。

Breakpoint インスタンスは以下のメソッドを持ちます。

deleteMe()

このブレークポイントをファイル/行に関連付けられたリストから削除します。 このブレークポイントがその行に設定された最後のブレークポイントだった場合、 そのファイル/行に対するエントリ自体を削除します。

enable()

このブレークポイントを有効にします。

disable()

このブレークポイントを無効にします。

pprint([out])

このブレークポイントに関するすべての情報を表示します。

  • ブレークポイント番号
  • テンポラリブレークポイントかどうか
  • ファイル/行の位置
  • ブレークする条件
  • 次のN回無視されるか
  • ヒットカウント
class bdb.Bdb

Bdb は一般的なPythonデバッガーの基本クラスとして振舞います。

このクラスはトレース機能の詳細を扱います。ユーザーとのインタラクションは、 派生クラスが実装するべきです。標準ライブラリのデバッガクラス (pdb.Pdb) がその利用例です。

以下の Bdb のメソッドは、通常オーバーライドする必要はありません。

canonic(filename)

標準化されたファイル名を取得するための補助関数。標準化されたファイル名とは、 (大文字小文字を区別しないファイルシステムにおいて)大文字小文字を正規化し、 絶対パスにしたものです。ファイル名が “<” と “>” で囲まれていた場合はそれを 取り除いたものです。

reset()

botframe, stopframe, returnframe, quitting 属性を、デバッグを始める準備ができている状態に設定します。

trace_dispatch(frame, event, arg)

この関数は、デバッグされているフレームのトレース関数としてインストールされます。 戻り値は新しいトレース関数(殆どの場合はこの関数自身)です。

デフォルトの実装は、実行しようとしている event (文字列として渡されます)に基づいて フレームにどうディスパッチするかを決定します。 event は次のうちのどれかです。

  • "line": 新しい行を実行しようとしています
  • "call": 関数が呼び出されているか、別のコードブロックに入ります。
  • "return": 関数か別のコードブロックからreturnします。
  • "exception": 例外が発生しました。
  • "c_call": C関数を呼び出そうとしています。
  • "c_return": C関数から戻りました。
  • "c_exception": C関数が例外を投げました。

Pythonのイベントについては、以下の専用の関数群が呼ばれます。Cのイベントについては何もしません。

arg 引数は以前のイベントに依存します。

トレース関数についてのより詳しい情報は、 debugger-hooks を参照してください。 コードとフレームオブジェクトについてのより詳しい情報は、 標準型の階層 を参照してください。

dispatch_line(frame)

デバッガーが現在の行で止まるべきであれば、 user_line() メソッド (サブクラスでオーバーライドされる)を呼び出します。 Bdb.quitting フラグ(user_line() から設定できます)が設定されていた場合、 BdbQuit 例外を発生させます。 このスコープのこれからのトレースのために、 trace_dispatch() メソッドの 参照を返します。

dispatch_call(frame, arg)

デバッガーがこの関数呼び出しで止まるべきであれば、 user_call() メソッド (サブクラスでオーバーライドされる)を呼び出します。 Bdb.quitting フラグ(user_line() から設定できます)が設定されていた場合、 BdbQuit 例外を発生させます。 このスコープのこれからのトレースのために、 trace_dispatch() メソッドの 参照を返します。

dispatch_return(frame, arg)

デバッガーがこの関数からのリターンで止まるべきであれば、 user_call() メソッド (サブクラスでオーバーライドされる)を呼び出します。 Bdb.quitting フラグ(user_line() から設定できます)が設定されていた場合、 BdbQuit 例外を発生させます。 このスコープのこれからのトレースのために、 trace_dispatch() メソッドの 参照を返します。

dispatch_exception(frame, arg)

デバッガーがこの例外発生で止まるべきであれば、 user_call() メソッド (サブクラスでオーバーライドされる)を呼び出します。 Bdb.quitting フラグ(user_line() から設定できます)が設定されていた場合、 BdbQuit 例外を発生させます。 このスコープのこれからのトレースのために、 trace_dispatch() メソッドの 参照を返します。

stop_here(frame)

このメソッドは frame がコールスタック中で botframe よりも下にあるかチェックします。 botframe はデバッグを開始したフレームです。

break_here(frame)

このメソッドは、 frame に属するファイル名と行に、あるいは、少なくとも現在の関数に ブレークポイントがあるかどうかをチェックします。 ブレークポイントがテンポラリブレークポイントだった場合、このメソッドはその ブレークポイントを削除します。

break_anywhere(frame)

このメソッドは、現在のフレームのファイル名の中にブレークポイントが存在するかどうかをチェックします。

継承クラスはデバッガー操作をするために以下のメソッド群をオーバーライドするべきです。

user_call(frame, argument_list)

このメソッドは、呼ばれた関数の中でブレークする必要がある可能性がある場合に、 dispatch_call() から呼び出されます。

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()

1行後ろでストップします。

set_next(frame)

与えられたフレームかそれより下(のフレーム)にある、次の行でストップします。

set_return(frame)

指定されたフレームから抜けるときにストップします。

set_until(frame)

現在の行番号よりも大きい行番号に到達したとき、あるいは、現在のフレーム から戻るときにストップします。

set_trace([frame])

frame からデバッグを開始します。 frame が指定されなかった場合、 デバッグは呼び出しもとのフレームから開始します。

set_continue()

ブレークポイントに到達するか終了したときにストップします。 もしブレークポイントが1つも無い場合、システムのトレース関数を None に設定します。

set_quit()

quitting 属性を True に設定します。 これにより、次回の dispatch_*() メソッドのどれかの呼び出しで、 BdbQuit 例外を発生させます。

継承クラスとクライアントは以下のメソッドをブレークポイント操作に利用できます。 これらのメソッドは、何か悪いことがあればエラーメッセージを含む文字列を返し、 すべてが順調であれば None を返します。

set_break(filename, lineno[, temporary=0[, cond[, funcname]]])

新しいブレークポイントを設定します。 引数の lineno 行が filename に存在しない場合、エラーメッセージを返します。 filename は、 canonic() メソッドで説明されているような、標準形である 必要があります。

clear_break(filename, lineno)

filenamelineno 行にあるブレークポイントを削除します。 もしブレークポイントが無かった場合、エラーメッセージを返します。

clear_bpbynumber(arg)

Breakpoint.bpbynumber の中で arg のインデックスを持つブレークポイントを 削除します。 arg が数値でないか範囲外の場合、エラーメッセージを返します。

clear_all_file_breaks(filename)

filename に含まれるすべてのブレークポイントを削除します。 もしブレークポイントが無い場合、エラーメッセージを返します。

clear_all_breaks()

すべてのブレークポイントを削除します。

get_break(filename, lineno)

filenamelineno にブレークポイントが存在するかどうかをチェックします。

get_breaks(filename, lineno)

filenamelineno にあるすべてのブレークポイントを返します。 ブレークポイントが存在しない場合空のリストを返します。

get_file_breaks(filename)

filename の中のすべてのブレークポイントを返します。 ブレークポイントが存在しない場合は空のリストを返します。

get_all_breaks()

セットされているすべてのブレークポイントを返します。

継承クラスとクライアントは以下のメソッドを呼んでスタックトレースを表現する データ構造を取得することができます。

get_stack(f, t)
format_stack_entry(frame_lineno[, lprefix=': '])

(frame, lineno) で指定されたスタックエントリに関する次のような情報を持つ 文字列を返します。

  • そのフレームを含むファイル名の標準形
  • 関数名、もしくは "<lambda>"
  • 入力された引数
  • 戻り値
  • (あれば)その行のコード

以下の2つのメソッドは、文字列として渡された文(statement)をデバッグするもので、 クライアントから利用されます。

run(cmd[, globals[, locals]])

exec 文を利用して文を実行しデバッグします。 globals はデフォルトでは __main__.__dict__ で、 locals はデフォルトでは globals です。

runeval(expr[, globals[, locals]])

eval() 関数を利用して式を実行しデバッグします。 globalslocalsrun() と同じ意味です。

runctx(cmd, globals, locals)

後方互換性のためのメソッドです。 run() を使ってください。

runcall(func, *args, **kwds)

1つの関数呼び出しをデバッグし、その結果を返します。

最後に、このモジュールは以下の関数を提供しています。

bdb.checkfuncname(b, frame)

ブレークポイントが行番号で設定されていた場合、この関数は b.line が、同じく引数と して与えられた frame の中の行に一致するかどうかをチェックします。 ブレークポイントが関数名で設定されていた場合、この関数は frame が指定された関数の ものであるかどうかと、その関数の最初の行であるかどうかをチェックします。

bdb.effective(file, line, frame)

アクティブなブレークポイントがこのコードの行にあるかどうかをチェックします。 ブレークポイントがあればその番号を、なければ (None, None) を返します。

その場所にブレークポイントがあると判っている場合にだけ呼び出されます。 アクティブな(triggerdな)ブレークポイントと、(そのブレークポイントが テンポラリブレークポイントだったときに)削除しても良いかどうかを示すフラグを 返します。

(訳注: (breakpoint, 0 or 1) のタプルを返します。タプルの2つ目の要素が1のとき、かつ、 breakpoint がテンポラリな場合に、そのブレークポイントを削除できるという意味です)

bdb.set_trace()

Bdb クラスのインスタンスを使って、呼び出しもとのフレームからデバッグを開始します。