デバッガに入るべき最も重要なタイミングは、Lispエラーが発生したときです。これにより、エラーの直接的な原因を調査することができます。
ただし、デバッガへの進入はエラーによる通常の結果ではありません。多くのコマンドは、不適切に呼び出された際にLispエラーを通知しますが、通常の編集作業中にその都度デバッガに入るのは非常に不便です。したがって、エラー時にデバッガへ進入させたい場合は、変数
debug-on-error に nil
以外の値を設定してください。(コマンド toggle-debug-on-error
を使えば、これを簡単に行えます。)
なお、技術的な理由により、本節で定義されている機能を用いて、再表示コードが呼び出したLispのエラーをデバッグすることはできません。これらに関するヘルプについては、再表示エラーのデバッグを参照してください。
この変数は、エラーが通知され処理されなかった場合にデバッガが呼び出されるかどうかを決定します。debug-on-error が t の場合、debug-ignored-errors(後述)に列挙されているものを除き、あらゆる種類のエラーでデバッガが呼び出されます。nil の場合、どのエラーでもデバッガは呼び出されません。
この値には、エラー条件のリストを指定することもできます(エラーの通知方法を参照)。その場合、デバッガはこのリストに含まれるエラー条件(debug-ignored-errorsにも記載されているものを除く)に対してのみ呼び出されます。例えば、debug-on-errorにリスト(void-variable)を設定した場合、デバッガは値を持たない変数に関するエラーに対してのみ呼び出されます。
なお、eval-expression-debug-on-error
は場合によってはこの変数を上書きします。以下を参照してください。
この変数が nil 以外の場合、Emacs
はプロセスフィルタ関数やセンチネルの周囲にエラーハンドラを作成しません。そのため、これらの関数内でエラーが発生するとデバッガも呼び出されます。プロセスを参照してください。
この変数は、debug-on-error
の値にかかわらず、デバッガに進入させるべきではないエラーを指定します。その値は、エラー条件シンボルおよび/または正規表現のリストです。エラーにこれらの条件シンボルのいずれかが含まれているか、あるいはエラーメッセージが正規表現のいずれかに一致する場合、そのエラーはデバッガに進入しません。
この変数の通常の値には user-error
のほか、編集中に頻繁に発生するものの、Lispプログラムのバグに起因することは稀ないくつかのエラーが含まれます。ただし、「稀」であっても「決してない」わけではありません。もしプログラムがこのリストに該当するエラーで失敗した場合は、このリストを変更してエラーのデバッグを試みることができます。最も簡単な方法は、通常
debug-ignored-errors を nil に設定することです。
この変数が nil 以外の値(デフォルト)を持つ場合、コマンド eval-expression を実行すると、debug-on-error が一時的に t
にバインドされます。The GNU Emacs Manual の Evaluating
Emacs Lisp Expressions を参照してください。
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 で指定された条件を満たしている必要があります。)
例えば、この変数を設定しておくと、emacsclientの--evalオプションで評価されたコードからバックトレースを取得する際に便利です。emacsclientで評価されたLispコードが、この変数がnil以外である状態でエラーを発生させると、実行中のEmacsにバックトレースがポップアップ表示されます。
警告: この変数に nil
以外の値を設定すると、予期せぬ影響が出る可能性があります。Emacs
のさまざまな箇所で通常の動作中にエラーが発生するため、そこでエラーが起きていることにさえ気づかない場合があります。condition-case で囲まれたコードをデバッグする必要がある場合は、condition-case-unless-debug の使用を検討してください(エラー処理を行うコードの書き方 を参照)。
debug-on-event に特殊イベント(特殊イベントを参照)を設定すると、Emacs はこのイベントを受信するとすぐに special-event-map を介さずにデバッガに入ろうとします。現在、サポートされている値はシグナル
SIGUSR1 および SIGUSR2
に対応するもののみです(これがデフォルトです)。これは、inhibit-quit
が設定されており、かつ Emacs がそれ以外に反応していない場合に有用です。
debug-on-message に正規表現を指定すると、Emacs
はエコーエリアに一致するメッセージが表示された場合にデバッガに入ります。例えば、特定のメッセージの原因を探る際に便利です。
e コマンドを使用すると、現在のスタックフレームにあるフォームを ‘*Backtrace*’ バッファで評価できます。また、デバッグ中は e および C-x C-e
コマンドを使用して同様の操作を行うことが可能です。デフォルトでは、これらのコマンドによるデバッガの起動は抑制されています(この時点でデバッガに(再)入ると、通常は現在のデバッグコンテキストから抜けてしまうためです)。これらのコマンドでデバッガに再帰的に進入できるようにするには、debug-allow-recursive-debug に nil 以外の値を設定してください。
initファイルの読み込み時に発生するエラーをデバッグするには、オプション ‘--debug-init’ を使用してください。これにより、initファイルの読み込み中に
debug-on-error が t
にバインドされ、通常であればinitファイル内のエラーを捕捉する condition-case
がバイパスされます。