ここでは、デバッガを呼び出すために使用される関数 debug について詳細に説明します。
この関数はデバッガに入ります。対話型セッションでは、*Backtrace*(デバッガへの2回目の再帰的な進入である場合は*Backtrace*<2>など)という名前のバッファに切り替え、そこにLisp関数呼び出しのスタックに関する情報を書き込みます。その後、再帰的な編集に入り、デバッガモードでバックトレースバッファを表示します。バッチモード(より一般的には、noninteractiveがnilでない場合。バッチモードを参照)では、この関数は標準エラーストリームにLispのバックトレースを表示します。backtrace-on-error-noninteractiveにnilをバインドすると、バッチモードでのバックトレースが抑制されます。詳細は後述します。
デバッガモードの c、d、j、および r コマンドは再帰的な編集を終了し、その後 debug が直前のバッファに切り替えて、debug
を呼び出した元の処理に戻ります。関数 debug が呼び出し元に戻るには、この方法しかありません。
debugger-args を使用するのは、debug
が残りの引数を *Backtrace*
バッファの先頭に表示し、ユーザーがそれらを確認できるようにするためです。以下に述べる場合を除き、これらの引数が使用される方法はこれのみです。
ただし、debug の第1引数に指定される特定の値には、特別な意味があります。(通常、これらの値は
Emacs の内部処理でのみ使用され、debug
を呼び出すプログラマが使用することはありません。)以下に、これらの特別な値の一覧を示します。
lambda ¶lambda の第1引数は、debug-on-next-call が nil
ではなかった際に関数へのエントリによって debug
が呼び出されたことを意味します。デバッガはバッファの最上部にテキスト行として ‘Debugger
entered--entering a function:’ を表示します。
debug第1引数として debug
が指定されるのは、エントリ時にデバッグモードに設定された関数に入ったため、debug
が呼び出されたことを意味します。デバッガは、lambda の場合と同様に、文字列
‘Debugger entered--entering a
function:’
を表示します。また、その関数のスタックフレームにマークを付けることで、関数終了時にデバッガが呼び出されるようにします。
t第1引数が t の場合、これは debug-on-next-call が nil
でないときに関数呼び出し形式が評価され、debug
が呼び出されることを示します。デバッガはバッファの最上行に ‘Debugger
entered--beginning evaluation of function call form:’ と表示します。
exit第1引数が 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 の先頭に nil を指定してください。debugger-args
の残りの部分は、バッファの最上行に表示されます。この機能を利用してメッセージを表示できます—例えば、debug が呼び出される条件を忘れないようにするなどです。
この変数がデフォルトの nil 以外の場合、バッチモードでデバッガを起動すると Lisp
関数呼び出しのバックトレースが表示されます。この変数に nil
の値をバインドすると、バックトレースが抑制され、エラーメッセージのみが表示されます。