Next: Edebugの実行モード, Previous: Edebugの使用, Up: Edebug [Contents][Index]
LispコードのデバッグにEdebugを使用するためには、最初にそのコードをインストルメント(instrument: 計装)しなければなりません。コードをインストルメントすると、適切な位置でEdebugを呼び出すために追加コードが挿入されます。
関数定義でプレフィクス引数とともにコマンドC-M-x
(eval-defun
)を呼び出すと、それを評価する前にその定義をインストルメントします(ソースコード自体は変更しない)。変数edebug-all-defs
が非nil
ならプレフィクス引数の意味を反転します。この場合は、C-M-xはプレフィクス引数がなければその定義をインストルメントします。edebug-all-defs
のデフォルト値はnil
です。コマンドM-x
edebug-all-defsは変数edebug-all-defs
の値を切り替えます。
edebug-all-defs
が非nil
ならeval-region
、eval-buffer
もそれらが評価する定義をインストルメントします。同様にedebug-all-forms
は、eval-region
が(非定義フォームさえ含むあらゆるフォームをインストルメントするべきかを制御します。これはミニバッファー内でのロードや評価には適用されません。コマンドM-x
edebug-all-formsはこのオプションを切り替えます。
他にもコマンドM-x
edebug-eval-top-level-formが利用でき、これはedebug-all-defs
やedebug-all-forms
の値に関わらずトップレベルのすべてのフォームをインストルメントします。edebug-defun
はedebug-eval-top-level-form
のエイリアスです。
Edebugがアクティブのの間、コマンドI(edebug-instrument-callee
)はポイント後のリストフォームに呼び出される関数およびマクロ定義がまだインストルメントされていなければ、それらをインストルメントします。これはそのファイルのソースの場所をEdebugが知っている場合だけ可能です。この理由によりEdebugロード後は、たとえ評価する定義をインストルメントしない場合でも、eval-region
は評価するすべての定義の位置を記録します。インストルメント済み関数呼び出しにステップインするiコマンドも参照してください(ジャンプを参照)。
Edebugはすべての標準スペシャルフォーム、式引数をもつinteractive
フォーム、無名ラムダ式、およびその他の定義フォームのインストルメント方法を知っています。しかしEdebugはユーザー定義マクロが引数にたいして何を行うかを判断できないので、Edebug仕様を使用してその情報を与えなければなりません。詳細はEdebugとマクロを参照してください。
Edebugがセッション内で最初にコードをインストルメントしようとするときは、フックedebug-setup-hook
を実行してからそれにnil
をセットします。使おうとしているパッケージに結びつけてEdebug仕様をロードするためにこれを使用できますが、それはEdebugを使用するときだけ機能します。
Edebugがインストルメント中にシンタックスエラー(syntax error:
構文エラー)を検知した場合には、以下のように間違ったコードの箇所にポイントを残してinvalid-read-syntax
エラーをシグナルします:
error→ Invalid read syntax: "Expected lambda expression"
このようにインストルメントに失敗する可能性の1つとして、いくつかのマクロ定義をEmacsが把握していない場合があります。これに対処するためには、インストルメントしようとしている関数を定義しているファイルをロードしてください。
定義からインストルメントを削除するには、単にインストルメントを行わない方法でその定義を再評価するだけです。フォームを絶対にインストルメントせずに評価するには2つの方法があります。それはファイルからのload
による評価と、ミニバッファーからのeval-expression
(M-:)による評価です。
定義からインストルメントを削除する別の方法はedebug-remove-instrumentation
コマンドの使用です。これはインストルメントしたすべてからインストルメントを削除することもできます。
Edebug内で利用可能な他の評価関数については、評価を参照してください。