以下ではデバッガを呼び出すために使用される関数debug
の完全な詳細を説明します。
この関数はデバッガにエンターする。インタラクティブなセッションではこの関数は*Backtrace*(デバッガへの2回目以降の再帰エントリーでは*Backtrace*<2>、...)という名前のバッファーにバッファーを切り替えて、Lisp関数呼び出しについての情報を書き込む。それから再帰編集にエンターして、Debuggerモードでbacktraceバッファーを表示する。バッチモード(より一般的にはnoninteractive
が非nil
の場合;
batchモードを参照)、この関数は標準エラーストリームにLispのバックトレースを表示した後に非0のexitコードでEmacsをkillする(Emacsのkillを参照)。バッチモードでバックトレースを抑止するにはbacktrace-on-error-noninteractive
にnil
をバインドすればよい。以下を参照のこと。
Debuggerモードのコマンドc、d、j、rは再帰編集をexitする。その後、debug
は以前のバッファーに戻って、debug
を呼び出したものが何であれそこにリターンする。これは関数debug
が呼び出し元にリターンできる唯一の方法である。
debugger-argsを使用すると、debug
は*Backtrace*の最上部に残りの引数を表示するしてユーザーがそれらを確認できる。以下で説明する場合を除いて、これはこれらの引数を使用する唯一の方法である。
しかしdebug
への1つ目の引数にたいする値は、特別な意味をもつ(これらの値は通常はdebug
を呼び出すプログラマーではなく、Emacs内部でのみ使用される)。以下はこれら特別な値のテーブルである:
lambda
¶1つ目の引数がlambda
のなら、それはdebug-on-next-call
が非nil
のときに関数にエントリーしたことによってdebug
が呼び出されたことを意味する。デバッガはバッファーのトップのテキスト行に‘Debugger
entered--entering a function:’と表示する。
debug
1つ目の引数がdebug
なら、それはエントリー時にデバッグされるようにセットされた関数にエントリーしたことにってdebug
が呼び出されたことを意味する。デバッガはlambda
のときと同様、‘Debugger
entered--entering a
function:’を表示する。これはその関数のスタックフレームもマークするので、exit時にデバッガが呼び出される。
t
1つ目の引数がt
なら、それはdebug-on-next-call
が非nil
のときに関数呼び出しの評価によってdebug
が呼び出されたことを示す。デバッガはバッファーのトップの行に‘Debugger
entered--beginning evaluation of function call form:’と表示する。
exit
1つ目の引数がexit
のときは、exit時にデバッガを呼び出すよう以前にマークされたスタックフレームをexitしたことを示す。この場合はdebug
に与えられた2つ目の引数がそのフレームからリターンされた値になる。デバッガはバッファーのトップの行に‘Debugger
entered--returning value:’とリターンされた値を表示する。
error
¶1つ目の引数がerror
のときは、ハンドルされていないエラーまたはquit
がシグナルされてデバッガにエンターした場合であり、デバッガは‘Debugger
entered--Lisp error:’とその後にシグナルされたエラーとsignal
への引数を表示してそれを示す。たとえば、
(let ((debug-on-error t)) (/ 1 0))
------ Buffer: *Backtrace* ------ Debugger entered--Lisp error: (arith-error) /(1 0) ... ------ Buffer: *Backtrace* ------
エラーがシグナルされた場合はおそらく変数debug-on-error
は非nil
で、quit
がシグナルされた場合はおそらく変数debug-on-quit
は非nil
である。
nil
明示的にデバッガにエンターしたいときは、debugger-argsの1つ目の引数にnil
を使用する。残りのdebugger-argsはバッファーのトップの行にプリントされる。メッセージ
— たとえばdebug
が呼び出された条件を思い出すためのリマインダーとして — の表示にこの機能を使用できる。
この変数が非nil
(デフォルト)の場合には、バッチモードでデバッガにエンターするとLisp関数呼び出しのバックトレースを表示する。この変数の値をnil
にバインドすることによってバックトレースの表示は抑制されてエラーメッセージだけが表示されるようになる。