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


17.1.8 Internals of the Debugger

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

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をリターンします。