Чтобы исследовать проблему, возникающую в середине программы, полезный приём — входить в отладчик всякий раз, когда вызывается определённая функция. Вы можете сделать это для функции, в которой возникает проблема, и затем пройти по шагам внутри неё, или сделать это для функции, вызываемой непосредственно перед проблемой, быстро пройти вызов этой функции, а затем пройти по шагам её вызывающий код.
Эта функция предписывает имени-функции вызывать отладчик при каждом своём вызове.
Любая функция или макрос, определённые как код на 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)
------ Буфер: *Backtrace* ------ Отладчик вошёл -- вход в функцию: * fact(3) eval((fact 3)) eval-last-sexp-1(nil) eval-last-sexp(nil) call-interactively(eval-last-sexp) ------ Буфер: *Backtrace* ------
Эта функция отменяет действие debug-on-entry для имени-функции. При интерактивном вызове запрашивает имя-функции в минибуфере. Если имя-функции опущено или равно nil, она отменяет остановку при входе для всех функций. Вызов cancel-debug-on-entry ничего не делает для функции, которая в данный момент не настроена на остановку при входе.