Spec-Zone.ru › Elisp

Ввод отладчика при вызове функции

Для исследования проблемы, возникающей в середине программы, полезной техникой является ввод отладчика всякий раз, когда вызывается определённая функция. Вы можете сделать это для функции, в которой возникает проблема, а затем шаг за шагом пройтись по функции, или вы можете сделать это для функции, которая вызывается незадолго до проблемы, быстро перейти через вызов этой функции и затем пройтись по её вызывающей функции.

Команда: debug-on-entry имя-функции

Эта функция запрашивает, чтобы имя-функции вызывала отладчик каждый раз, когда она вызывается.

Любая функция или макрос, определённая как код Lisp, может быть установлена для прерывания при входе, независимо от того, является ли это интерпретируемый код или скомпилированный код. Если функция является командой, она войдёт в отладчик при вызове из Lisp и при интерактивном вызове (после чтения аргументов). Вы также можете установить debug-on-entry для примитивных функций (то есть тех, которые написаны на C) таким образом, но это срабатывает только при вызове примитива из кода Lisp. debug-on-entry не разрешено для специальных форм.

Когда debug-on-entry вызывается интерактивно, она запрашивает имя-функции в минибуфере. Если функция уже настроена на вызов отладчика при входе, debug-on-entry ничего не делает. debug-on-entry всегда возвращает имя-функции.

Вот пример, чтобы проиллюстрировать использование этой функции:

(defun fact (n)
  (if (zerop n) 1
      (* n (fact (1- n)))))
     ⇒ fact
(debug-on-entry 'fact)
     ⇒ fact
(fact 3)
------ Buffer: *Backtrace* ------
Debugger entered--entering a function:
* fact(3)
  eval((fact 3))
  eval-last-sexp-1(nil)
  eval-last-sexp(nil)
  call-interactively(eval-last-sexp)
------ Buffer: *Backtrace* ------
Команда: cancel-debug-on-entry &optional имя-функции

Эта функция отменяет действие debug-on-entry на имя-функции. При интерактивном вызове она запрашивает имя-функции в минибуфере. Если имя-функции опущено или nil, она отменяет прерывание при входе для всех функций. Вызов cancel-debug-on-entry ничего не делает для функции, которая не настроена на прерывание при входе.

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/Function-Debugging.html

Spec-Zone.ru

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