Previous: , Up: Debugger   [Contents][Index]


17.1.8 デバッガの内部

このセクションではデバッガ内部で使用される関数と変数について説明します。

Variable: debugger

この関数の値はデバッガを呼び出す関数呼び出しである。値には任意個数の引数をとる関数、より具体的には関数の名前でなければならない。この関数は何らかのデバッガを呼び出すこと。この変数のデフォルト値はdebug

関数にたいしてLispが渡す1つ目の引数は、その関数がなぜ呼び出されたかを示す。引数の慣習についてはdebug(Invoking the Debugger)に詳解がある。

Command: backtrace

この関数は現在アクティブな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 ------------
Variable: debug-on-next-call

この変数が非nilなら、それは次のevalapplyfuncallの前にデバッガを呼び出すよう指定する。デバッガへのエンターによってdebug-on-next-callnilにセットされる。

デバッガのdコマンドは、この変数をセットすることにより機能します。

Function: backtrace-debug level flag

この関数はそのスタックフレームのlevel下位のスタックフレームのdebug-on-exitフラグにflagに応じた値をセットする。flagが非nilなら、後でそのフレームをexitするときデバッガにエンターする。そのフレームを通じた非ローカルexitでも、デバッガにエンターする。

この関数はデバッガだけに使用される。

Variable: command-debug-status

この変数はカレントのインタラクティブコマンドのデバッグ状態を記録する。コマンドがインタラクティブに呼び出されるたびに、この変数はnilにバインドされる。デバッガは同じコマンドが呼び出されたときのデバッガ呼び出しに情報を残すために、この変数をセットできる。

普通のグローバル変数ではなくこの変数を使用する利点は、そのデータが後続のコマンド呼び出しに決して引き継がれないことである。

Function: backtrace-frame frame-number

関数backtrace-frameはLispデバッガ内での使用を意図している。これはframe-numberレベル下位のスタックフレームで、何の評価が行われているかに関する情報をリターンする。

そのフレームがまだ引数を評価していない、またはそのフレームがスペシャルフォームの場合、値は(nil function arg-forms…)

そのフレームが引数を評価して関数をすでに呼び出していたら、リターン値は(t function arg-values…)

リターン値のfunctionは何であれ評価されたリストのCARとして提供される。マクロ呼び出しの場合はlambda式になる。その関数に&rest引数があればリストarg-valuesの末尾に示される。

frame-numberが範囲外ならbacktrace-framenilをリターンする。