Next: Infinite Loops, Up: Debugger [Contents][Index]
デバッガに入る一番重要なタイミングは、Lispエラーが発生したときです。デバッガでは、エラーの直接原因を調査できます。
しかしデバッガへのエンターは、エラーによる通常の結末ではありません。多くのコマンドは不適切に呼び出されたときにLispエラーをシグナルするので、通常の編集の間にこれが発生するたびデバッガにエンターするのは、とても不便でしょう。したがって、エラーの際にデバッガにエンターしたい場合は、変数debug-on-errorに非nilをセットします。(コマンドtoggle-debug-on-errorは、これを簡単に行う方法を提供します。)
この変数はエラーがシグナルされ、それがハンドルされていないときに、デバッガが呼び出されるかどうかを決定します。debug-on-errorがtの場合は、debug-ignored-errors(以下を参照)にリストされているエラーを除く、すべての種類のエラーがデバッガを呼び出します。nilの場合は、デバッガを呼び出しません。
値にはエラー条件(Signaling Errorsを参照)のリストも指定できます。その場合、このリスト内のエラー条件だけにより、デバッガが呼び出されます(debug-ignored-errorsにもリストされているエラー条件は除外されます)。たとえば、debug-on-errorをリスト(void-variable)にセットした場合には、値をもたない変数に関するエラーにたいしてだけデバッガが呼び出されます。
eval-expression-debug-on-errorがこの変数をオーバーライドする場合がいくつかあることに注意してください(以下を参照)。
この変数が非nilのとき、Emacsはプロセスフィルター関数と番兵(sentinel)の周囲にエラーハンドラーを作成しません。したがって、これらの関数内でのエラーは、デバッガを呼び出します。Processesを参照してください。
この変数は、debug-on-errorの値に関わらず、デバッガにエンターすべきでないエラーを指定します。変数の値はエラー条件のシンボル、および/または正規表現のリストです。エラーがこれら条件シンボルのいずれか、またはエラーメッセージが正規表現のいずれかにマッチする場合、そのエラーはデバッガにエンターしません。
この変数の通常の値にはuser-errorと、同様に編集中にしばしば発生するがLispプログラムのバグによるものはほとんどない、いくつかのエラーが含まれます。しかし、“ほとんどない”は“絶対ない”ではありません。あなたのプログラムがこのリストにマッチするエラーにより機能しない場合は、そのエラーをデバッグするために、このリストの変更を試みるのもよいでしょう。通常はdebug-ignored-errorsをnilにセットしておくのが、もっとも簡単な方法です。
この変数が非nil値(デフォルト)の場合は、コマンドeval-expressionの実行により、一時的にdebug-on-errorがtがバインドされます。Evaluating Emacs-Lisp Expressions in The GNU Emacs
Manualを参照してください。
eval-expression-debug-on-errorがnilの場合は、eval-expressionの間もdebug-on-errorの値は変更されません。
condition-caseによりキャッチされたエラーは通常、決してデバッガを呼び出しません。condition-caseは、デバッガがそのエラーをハンドルする前に、エラーをハンドルする機会を得ます。
debug-on-signalを非nil値に変更した場合は、condition-caseの存在如何に関わらず、すべてのエラーにおいてデバッガが最初に機会を得ます。(デバッガを呼び出すためには、依然としてそのエラーがdebug-on-errorとdebug-ignored-errorsで指定された条件を満たさなければなりません。)
警告:
この変数を非nilにセットすると、芳しくない効果があるかもしれません。Emacsのさまざまな部分で処理の通常の過程としてエラーがキャッチされており、そのエラーが発生したことに気づかないことさえあるかもしれません。condition-caseでラップされたコードをデバッグする必要がある場合は、condition-case-unless-debug(see Handling Errorsを参照)の使用を考慮してください。
debug-on-eventをスペシャルイベント(Special Eventsを参照)にセットした場合は、Emacsはspecial-event-mapをバイパスして、このイベントを受け取ると即座にデバッガへのエンターを試みます。現在のところサポートされる値は、シグナルSIGUSR1およびSIGUSR2に対応する値だけです(これがデフォルトです)。これはinhibit-quitがセットされていて、それ以外はEmacsが応答しない場合に有用かもしれません。
debug-on-messageに正規表現をセットした場合には、それにマッチするメッセージがエコーエリアに表示されると、Emacsはデバッガにエンターします。たとえば、これは特定のメッセージの原因を探すのに有用かもしれません。
initファイルロード中に発生したエラーをデバッグするには、オプション‘--debug-init’を使用します。これはinitファイルロードの間にdebug-on-errorをtにバインドして、通常はinitファイル内のエラーをキャッチするcondition-caseをバイパスします。