Next: , Previous: , Up: Edebug   [Contents][Index]


17.2.2 Instrumenting for Edebug

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-regioneval-current-buffereval-bufferも、それらが評価する定義をインストルメントします。同様に、edebug-all-formsは、eval-regionが(非定義フォームさえ含む)あらゆるフォームをインストルメントすべきかを制御します。これはミニバッファー内でのロードや評価には適用されません。コマンドM-x edebug-all-formsは、このオプションを切り替えます。

他にもコマンドM-x edebug-eval-top-level-formが利用可能で、これはedebug-all-defsedebug-all-formsの値に関わらず、トップレベルの任意のフォームをインストルメントします。edebug-defunedebug-eval-top-level-formのエイリアスです。

Edebugがアクティブのの間、コマンドI(edebug-instrument-callee)は、ポイント後のリストフォームに呼び出される関数およびマクロ定義がまだインストルメントされていなければ、それらをインストルメントします。これは、そのファイルのソースの場所をEdebugが知っている場合だけ可能です。この理由によりEdebugロード後は、たとえ評価する定義をインストルメントしない場合でも、eval-regionは評価するすべての定義の位置を記録します。インストルメント済み関数呼び出しにステップインするiコマンド(Jumpingを参照)も参照してください。

Edebugはすべての標準スペシャルフォーム、式引数をもつinteractiveフォーム、無名ラムダ式、およびその他の定義フォームのインストルメント方法を知っています。しかし、Edebugはユーザー定義マクロが引数にたいして何を行うかを判断できないので、Edebug仕様を使用してその情報を与えなければなりません。詳細はEdebug and Macrosを参照してください。

Edebugがセッション内で最初にコードをインストルメントしようとするときは、フックedebug-setup-hookを実行してから、それにnilをセットします。使おうとしているパッケージに結びつけてEdebug仕様をロードするためにこれを使用できますが、それはEdebugを使用するときだけ機能します。

定義からインストルメントを削除するには、単にインストルメントを行わない方法でその定義を再評価するだけです。フォームを絶対にインストルメントせずに評価するには、2つの方法があります。それはファイルからのloadによる評価と、ミニバッファーからのeval-expression(M-:)による評価です。

Edebugがインストルメント中にシンタックスエラー(syntax error: 構文エラー)を検知した場合は、間違ったコードの箇所にポイントを残してinvalid-read-syntaxエラーをシグナルします。

Edebug内で利用可能な他の評価関数については、Edebug Evalを参照してください。