Чтобы использовать Edebug для отладки кода Lisp, вы должны сначала инструментировать этот код. Инструментация кода вставляет дополнительный код в него, чтобы вызывать 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 инструментализировать любую
форму, даже не определяющие формы. Это не относится к загрузке или вычислениям
в minibuffer. Команда 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
(см. 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 и из minibuffer с eval-expression
(M-:).
Другой способ удалить инструментализацию из определения — использовать команду
edebug-remove-instrumentation. Она также позволяет удалить
инструментализацию со всего, что было инструментализировано.
См. Вычисление, для других функций вычисления, доступных внутри Edebug.