このセクションでは、デバッガが内部的に使用している関数や変数について説明します。
この変数の値は、デバッガを呼び出すために実行する関数です。その値は、任意の数の引数を取る関数であるか、あるいはより一般的には関数名である必要があります。この関数は、何らかのデバッガを呼び出す必要があります。この変数のデフォルト値は
debug です。
Lispが関数に渡す第1引数は、なぜその関数が呼び出されたのかを示します。引数に関する規約については、debugの説明に詳しく記載されています(デバッガの呼び出しを参照してください)。
この関数は、現在アクティブなLisp関数呼び出しのトレースを出力します。このトレースは、debug
が *Backtrace* バッファに表示するものと同一です。戻り値は常に nil となります。
In the following example, a Lisp expression calls backtrace explicitly. This prints the backtrace to the
stream standard-output, which, in this case, is
the buffer ‘backtrace-output’.
バックトレースの各行は、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 'testing (backtrace))
(progn ...) eval((progn (1+ var) (list '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 ------------
この変数が nil
以外の場合、バックトレースの各スタックフレームがリスト形式で表示されます。これは、特殊形式が通常の関数呼び出しと視覚的に区別できなくなるという代償と引き換えに、バックトレースの可読性を向上させることを目的としています。
debugger-stack-frame-as-list が nil でない場合、上記の例は次のようになります。
----------- Buffer: backtrace-output ------------ (backtrace) (list 'testing (backtrace))
(progn ...) (eval (progn (1+ var) (list '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 ------------
この変数がnil以外の場合、次のeval、apply、またはfuncallの前にデバッガを呼び出すよう指示します。デバッガに入ると、debug-on-next-callにnilが設定されます。
デバッガの d コマンドは、この変数を設定することで動作します。
この関数は、スタックを level レベル遡った位置にあるスタックフレームの debug-on-exit
フラグを設定し、その値を flag にします。flag が
nil
以外の場合、そのフレームが後に終了する際にデバッガが起動します。そのフレームを介した非ローカルな終了であっても、デバッガが起動します。
この関数はデバッガでのみ使用されます。
この変数は、現在の対話型コマンドのデバッグ状態を記録します。コマンドが対話的に呼び出されるたびに、この変数は nil
にバインドされます。デバッガはこの変数を設定することで、同一のコマンド呼び出しにおける後続のデバッガ呼び出しに向けた情報を残すことができます。
通常のグローバル変数ではなくこの変数を使用する利点は、データが後続のコマンド呼び出しに引き継がれることがない点にあります。
この変数は非推奨となっており、今後のバージョンで削除される予定です。
関数 backtrace-frame は、Lisp
デバッガでの使用を想定しています。この関数は、frame-number
レベル下のスタックフレームでどのような計算が行われているかに関する情報を返します。
そのフレームがまだ引数を評価していないか、あるいは特殊形式である場合、値は (nil function arg-forms…)
となります。
そのフレームがすでに引数を評価し、関数を呼び出している場合、戻り値は (t function arg-values…)
となります。
戻り値において、function は評価されたリストの CAR として指定された値、あるいはマクロ呼び出しの場合は lambda 式となります。関数に &rest
引数がある場合は、それがリスト arg-values の末尾として表現されます。
base が指定されている場合、frame-number は function が base である最上位フレームを基準にカウントされます。
frame-number が範囲外の場合、backtrace-frame は nil を返します。
関数 mapbacktrace は、関数 base
を持つ最初のフレーム(base が省略されているか nil の場合は最上部)から、バックトレースの各フレームに対して function を1回ずつ呼び出します。
functionは、evald、func、args、flagsの4つの引数で呼び出されます。
フレームがまだ引数を評価していないか、あるいは特殊形式である場合、evald は nil となり、args は形式のリストとなる。
フレームがすでに引数を評価し、関数を呼び出している場合、evald は t となり、args は値のリストとなります。flags は現在のフレームのプロパティのプリリストです。現在、サポートされている唯一のプロパティは :debug-on-exit であり、スタックフレームの debug-on-exit フラグがセットされている場合は t となります。