Spec-Zone.ru › Elisp

Инструментирование для Edebug

Чтобы использовать 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 инструментировать любую форму, даже не содержащую определения. Это не относится к загрузке и вычислению в минибуфере. Команда 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 обнаружит синтаксическую ошибку, точка останется в месте ошибки, и будет выдана ошибка invalid-read-syntax. Пример:

error→ Invalid read syntax: "Expected lambda expression"

Одна из возможных причин неудачного инструментирования — некоторые определения макросов ещё неизвестны Emacs. Чтобы обойти эту проблему, загрузите файл, в котором определена инструментируемая функция.

Чтобы удалить инструментирование определения, просто вычислите его повторно способом, не выполняющим инструментирование. Есть два способа вычислить формы без инструментирования: из файла с помощью load и из минибуфера с помощью eval-expression (M-:). Кроме того, команда C-M-x без префиксного аргумента и при значении edebug-all-defs, равном nil, также вычисляет определение функции без инструментирования.

Другой способ удалить инструментирование определения — использовать команду edebug-remove-instrumentation. Она также позволяет удалить инструментирование со всего, что было инструментировано.

Другие функции вычисления, доступные в Edebug, см. в разделе Вычисление.

Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Instrumenting.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API