プログラムの途中で発生する問題を調査するには、特定の関数が呼び出されるたびにデバッガに入るという手法が有効です。問題が発生している関数に対してこの操作を行い、その関数内をステップ実行することもできますし、あるいは問題が発生する直前に呼び出される関数に対してこの操作を行い、その関数への呼び出しを迅速にスキップしてから、その呼び出し元をステップ実行することもできます。
この関数は、呼び出されるたびにデバッガを起動するよう function-name をリクエストします。
Lispコードとして定義された関数やマクロは、インタプリタコードかコンパイルコードかにかかわらず、エントリ時にブレークするように設定できます。その関数がコマンドである場合、Lispから呼び出された際、および対話的に呼び出された際(引数の読み込み後)にデバッガに入ります。プリミティブ関数(すなわちC言語で記述された関数)に対しても同様の方法で debug-on-entry を設定できますが、これはプリミティブ関数がLispコードから呼び出された場合にのみ有効となります。特殊フォームに対して debug-on-entry は許可されていません。
debug-on-entry を対話的に呼び出すと、ミニバッファに function-name
の入力が求められます。関数がエントリ時にデバッガを呼び出すように既に設定されている場合、debug-on-entry は何もしません。debug-on-entry は常に function-name
を返します。
この関数の使い方を示す例を以下に挙げます。
(defun fact (n)
(if (zerop n) 1
(* n (fact (1- n)))))
⇒ fact
(debug-on-entry 'fact)
⇒ fact
(fact 3)
------ Buffer: *Backtrace* ------ Debugger entered--entering a function: * fact(3) eval((fact 3)) eval-last-sexp-1(nil) eval-last-sexp(nil) call-interactively(eval-last-sexp) ------ Buffer: *Backtrace* ------
この関数は、function-name に対する debug-on-entry の効果を解除します。対話的に呼び出された場合は、ミニバッファに function-name の入力を求めます。function-name が省略された場合、または nil
が指定された場合は、すべての関数に対して break-on-entry を解除します。cancel-debug-on-entry を呼び出しても、現在 break-on-entry
が設定されていない関数に対しては何も行われません。