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
。