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-current-buffer, и 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-:).

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

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

Copyright © 1990-1996, 1998-2022 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