Edebugを用いてLispコードをデバッグするには、まずコードをインストルメントする必要があります。コードのインストルメントとは、適切な箇所でEdebugを呼び出すための追加コードをコード内に挿入することです。
When you invoke command C-M-x (eval-defun) with a prefix argument on a function
definition, it instruments the definition before evaluating it. (This does
not modify the source code itself.) If the variable edebug-all-defs is non-nil,
that inverts the meaning of the prefix argument: in this case, C-M-x instruments the definition unless it has a prefix argument. The default value of
edebug-all-defs is nil.
The command M-x edebug-all-defs toggles the value of
the variable edebug-all-defs.
edebug-all-defs が nil
でない場合、コマンド eval-region および eval-buffer も、評価対象となるあらゆる定義にインストゥルメントを付与します。同様に、edebug-all-forms は、定義を伴わない形式であっても、eval-region があらゆる形式にインストゥルメントを付与するかどうかを制御します。これは、ミニバッファでの読み込みや評価には適用されません。コマンド
M-x edebug-all-forms でこのオプションを切り替えます。
edebug-all-defs および edebug-all-forms
の値にかかわらず、任意のトップレベルフォームにインストゥルメントを適用できる別のコマンド M-x
edebug-eval-top-level-form が用意されています。edebug-defun は edebug-eval-top-level-form のエイリアスです。
Edebugが有効な間、コマンド I (edebug-instrument-callee) は、リスト形式の after point
で呼び出された関数またはマクロの定義に、まだインストルメンテーションが施されていない場合に、それをインストルメンテーションします。これが可能なのは、Edebugがその関数のソースコードの場所を特定できている場合に限られます。そのため、Edebugのロード後、eval-region
はインストルメンテーションを行わない場合であっても、評価するすべての定義の位置を記録します。また、関数にインストルメンテーションを施した後に呼び出し箇所へステップインするコマンド
i(Jumping
を参照)も併せて参照してください。
Edebugは、すべての標準的な特殊形式、式引数を持つinteractive形式、無名ラムダ式、およびその他の定義形式にインストルメンテーションを施す方法を熟知しています。しかし、ユーザー定義マクロがマクロ呼び出しの引数をどのように処理するかをEdebugが自力で判断することはできないため、Edebug仕様を用いてその情報を提供する必要があります。詳細については、Edebugとマクロを参照してください。
Edebugがセッション内で初めてコードにインストルメンテーションを施そうとする際、フック edebug-setup-hook を実行し、その後 nil
に設定します。これを利用して、使用中のパッケージに関連付けられたEdebug仕様を読み込むことができますが、これはEdebugを使用している場合に限られます。
Edebugがインストルメンテーション中に構文エラーを検出した場合、エラーが発生したコード箇所にポイントを置き、invalid-read-syntaxエラーを通知します。例:
error→ Invalid read syntax: "Expected lambda expression"
このようなインストゥルメンテーションが失敗する原因の一つとして、一部のマクロ定義がまだEmacsに認識されていないことが考えられます。これを回避するには、インストゥルメンテーションしようとしている関数を定義しているファイルを読み込んでください。
定義からインストルメンテーションを取り除くには、インストルメンテーションを行わない方法でその定義を再評価すればよい。インストルメンテーションを一切行わずにフォームを評価する方法には、load を用いたファイルからの評価と、eval-expression (M-:)
を用いたミニバッファからの評価の2通りがある。さらに、プレフィックス引数なしの C-M-x で、かつ
edebug-all-defs を nil
に設定した場合も、インストルメンテーションを行うことなく関数の定義が評価される。
定義からインストルメンテーションを削除する別の方法として、edebug-remove-instrumentationコマンドを使用する方法があります。これにより、インストルメンテーションが適用されているすべての対象から、そのインストルメンテーションを削除することも可能です。
Edebug内で利用可能なその他の評価関数については、評価を参照してください。