Next: Explicit Debug, Previous: Infinite Loops, Up: Debugger [Contents][Index]
プログラムの途中で発生する問題を調べるための有用なテクニックの1つは、特定の関数が呼び出されたときデバッガにエンターする方法です。問題が発生した関数にこれを行い、その関数をステップで追ったり、問題箇所の少し手前の関数呼び出しでこれを行い、その関数をステップオーバーしてその後をステップで追うことができます。
この関数は、function-nameが呼び出されるたびにデバッガの呼び出しを要求します。
Lispコードで定義された任意の関数およびマクロは、インタープリターに解釈されたコードかコンパイル済みのコードかに関わらず、エントリーにbreakをセットできます。その関数がコマンドの場合は、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をキャンセルします。エントリー時にbreakするようセットアップされていない関数にcancel-debug-on-entryを呼び出したときは、何も行いません。