GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Internals-of-Debugger.html ・ emacs-doc.conao3.com

19.1.11 デバッガの内部

このセクションでは、デバッガが内部的に使用している関数や変数について説明します。

変数: debugger

この変数の値は、デバッガを呼び出すために実行する関数です。その値は、任意の数の引数を取る関数であるか、あるいはより一般的には関数名である必要があります。この関数は、何らかのデバッガを呼び出す必要があります。この変数のデフォルト値は debug です。

Lispが関数に渡す第1引数は、なぜその関数が呼び出されたのかを示します。引数に関する規約については、debugの説明に詳しく記載されています(デバッガの呼び出しを参照してください)。

関数: backtrace

この関数は、現在アクティブな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 ------------
ユーザーオプション: debugger-stack-frame-as-list

この変数が 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 ------------
変数: debug-on-next-call

この変数がnil以外の場合、次のeval、apply、またはfuncallの前にデバッガを呼び出すよう指示します。デバッガに入ると、debug-on-next-callにnilが設定されます。

デバッガの d コマンドは、この変数を設定することで動作します。

関数: backtrace-debug level flag

この関数は、スタックを level レベル遡った位置にあるスタックフレームの debug-on-exit フラグを設定し、その値を flag にします。flag が nil 以外の場合、そのフレームが後に終了する際にデバッガが起動します。そのフレームを介した非ローカルな終了であっても、デバッガが起動します。

この関数はデバッガでのみ使用されます。

変数: command-debug-status

この変数は、現在の対話型コマンドのデバッグ状態を記録します。コマンドが対話的に呼び出されるたびに、この変数は nil にバインドされます。デバッガはこの変数を設定することで、同一のコマンド呼び出しにおける後続のデバッガ呼び出しに向けた情報を残すことができます。

通常のグローバル変数ではなくこの変数を使用する利点は、データが後続のコマンド呼び出しに引き継がれることがない点にあります。

この変数は非推奨となっており、今後のバージョンで削除される予定です。

関数: backtrace-frame frame-number &optional base

関数 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 function &optional base

関数 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 となります。