Previous: Invoking the Debugger, Up: Debugger [Contents][Index]
このセクションではデバッガ内部で使用される関数と変数について説明します。
この関数の値はデバッガを呼び出す関数呼び出しである。値には任意個数の引数をとる関数、より具体的には関数の名前でなければならない。この関数は何らかのデバッガを呼び出すこと。この変数のデフォルト値はdebug。
関数にたいしてLispが渡す1つ目の引数は、その関数がなぜ呼び出されたかを示す。引数の慣習についてはdebug(Invoking the Debugger)に詳解がある。
この関数は現在アクティブなLisp関数呼び出しのトレースをプリントする。この関数はdebugが*Backtrace*バッファーに書き込む内容を得るために使用される。どの関数呼び出しがアクティブか判断するためにスタックにアクセスしなければならないので、この関数はCで記述されている。リターン値は常にnil。
以下の例ではLisp式で明示的にbacktraceを呼び出している。これはストリームstandard-output(この場合はバッファー‘backtrace-output’)にbacktraceをプリントする。
backtraceの各行は、1つの関数呼び出しを表す。関数の引数が既知なら行に値が表示され、まだ計算中の場合は行にその旨が示される。スペシャルフォームの引数は無視される。
(with-output-to-temp-buffer "backtrace-output"
(let ((var 1))
(save-excursion
(setq var (eval '(progn
(1+ var)
(list 'testing (backtrace))))))))
⇒ (testing nil)
----------- Buffer: backtrace-output ------------ backtrace() (list ...computing arguments...)
(progn ...) eval((progn (1+ var) (list (quote testing) (backtrace)))) (setq ...) (save-excursion ...) (let ...) (with-output-to-temp-buffer ...) eval((with-output-to-temp-buffer ...)) eval-last-sexp-1(nil)
eval-last-sexp(nil) call-interactively(eval-last-sexp) ----------- Buffer: backtrace-output ------------
この変数が非nilならバックトレースのすべてのスタックフレームはリストとして表示される。これは通常の関数呼び出しとバックトレースの特殊形式の視覚的な違いによるコストをなくして、バックトレースの可読性を向上することが目的。
debugger-stack-frame-as-listが非nilなら上記の例は以下のようになる:
----------- Buffer: backtrace-output ------------ (backtrace) (list ...computing arguments...)
(progn ...) (eval (progn (1+ var) (list (quote testing) (backtrace)))) (setq ...) (save-excursion ...) (let ...) (with-output-to-temp-buffer ...) (eval (with-output-to-temp-buffer ...)) (eval-last-sexp-1 nil)
(eval-last-sexp nil) (call-interactively eval-last-sexp) ----------- Buffer: backtrace-output ------------
この変数が非nilなら、それは次のeval、apply、funcallの前にデバッガを呼び出すよう指定する。デバッガへのエンターによってdebug-on-next-callはnilにセットされる。
デバッガのdコマンドは、この変数をセットすることにより機能します。
この関数はそのスタックフレームのlevel下位のスタックフレームのdebug-on-exitフラグにflagに応じた値をセットする。flagが非nilなら、後でそのフレームをexitするときデバッガにエンターする。そのフレームを通じた非ローカルexitでも、デバッガにエンターする。
この関数はデバッガだけに使用される。
この変数はカレントのインタラクティブコマンドのデバッグ状態を記録する。コマンドがインタラクティブに呼び出されるたびに、この変数はnilにバインドされる。デバッガは同じコマンドが呼び出されたときのデバッガ呼び出しに情報を残すために、この変数をセットできる。
普通のグローバル変数ではなくこの変数を使用する利点は、そのデータが後続のコマンド呼び出しに決して引き継がれないことである。
この変数は時代遅れであり将来のバージョンで削除されるだろう。
関数backtrace-frameはLispデバッガ内での使用を意図している。これはframe-numberレベル下位のスタックフレームで何の評価が行われているかに関する情報をリターンする。
そのフレームがまだ引数を評価していない、またはそのフレームがスペシャルフォームなら値は(nil function
arg-forms…)。
そのフレームが引数を評価して関数をすでに呼び出していたらリターン値は(t function
arg-values…)。
リターン値のfunctionは何であれ評価されたリストのCARとして提供される。マクロ呼び出しならlambda式。その関数に&rest引数があればリストarg-valuesの末尾に示される。
baseを指定するとframe-numberはfunctionがbaseであるようなフレームの上端から相対的に数えられる。
frame-numberが範囲外ならbacktrace-frameはnilをリターンする。
関数mapbacktraceはバックトレース上の関数がbaseであるようなフレーム(baseが省略かnilなら先頭)から順に各フレームにたいして一度functionを呼び出す。
functionはevald、func、args、flagsという4つの引数で呼び出される。
そのフレームがまだ引数を評価していない、またはそのフレームがスペシャルフォームならevaldはnil、argsはフォームのリスト。
フレームが引数を評価して関数を呼び出し済みならevaldはt、argsは値リスト。flagsはカレントフレームのプロパティのplist。サポートされるプロパティは現在のところ:debug-on-exitのみであり、そのスタックフレームのdebug-on-exitフラグがセットされていればt。