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
なら、それは次の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の末尾に示される。
frame-numberが範囲外ならbacktrace-frame
はnil
をリターンする。