19.1.10 Вызов отладчика

Здесь мы подробно описываем функцию debug, которая используется для вызова отладчика.

Команда: debug &rest debugger-args

Эта функция входит в отладчик. В интерактивных сессиях она переключается на буфер с именем *Backtrace* (или *Backtrace*<2> в случае второго рекурсивного входа в отладчик и т. д.), и заполняет его информацией о стеке вызовов функций Lisp. Затем она входит в рекурсивное редактирование, отображая буфер трассировки в режиме отладчика. В пакетном режиме (более обще, когда noninteractive не равно nil, см. Пактовый режим), эта функция выводит трассировку Lisp в поток стандартной ошибки, а затем завершает Emacs, вызывая выход с ненулевым кодом (см. Завершение Emacs). Привязка backtrace-on-error-noninteractive к nil подавляет трассировку в пакетном режиме, см. ниже.

Команды c, d, j и r в режиме отладчика выходят из рекурсивного редактирования; затем debug возвращается к предыдущему буферу и продолжает выполнение того, что вызвало debug. Это единственный способ, которым функция debug может вернуться к своему вызывающему коду.

Использование debugger-args заключается в том, что debug отображает оставшиеся аргументы в верхней части буфера *Backtrace*, чтобы пользователь мог их увидеть. За исключением описанного ниже, это единственный способ использования этих аргументов.

Однако некоторые значения первого аргумента для debug имеют особое значение. (Обычно эти значения используются только внутренними частями Emacs, а не программистами, вызывающими debug.) Вот таблица этих особых значений:

lambda

Первый аргумент lambda означает, что debug был вызван из-за входа в функцию, когда debug-on-next-call не был nil. Отладчик отображает «Debugger entered--entering a function:» как строку текста в верхней части буфера.

debug

debug в качестве первого аргумента означает, что debug был вызван из-за входа в функцию, для которой была установлена отладка при входе. Отладчик отображает строку «Debugger entered--entering a function:», как в случае lambda. Он также помечает кадр стека для этой функции, чтобы она вызывала отладчик при выходе.

t

Когда первый аргумент равен t, это указывает на вызов debug из-за вычисления формы вызова функции, когда debug-on-next-call не был nil. Отладчик отображает «Debugger entered--beginning evaluation of function call form:» как верхнюю строку в буфере.

exit

Когда первый аргумент равен exit, это указывает на выход кадра стека, ранее помеченного для вызова отладчика при выходе. Второй аргумент, переданный debug в этом случае, — это значение, возвращаемое из кадра. Отладчик отображает «Debugger entered--returning value:» в верхней строке буфера, за которым следует возвращаемое значение.

error

Когда первый аргумент равен error, отладчик указывает, что он был вызван из-за ошибки или вызова quit, которые не были обработаны, отображая «Debugger entered--Lisp error:», за которым следует сигнальная ошибка и любые аргументы для signal. Например,

(let ((debug-on-error t))
  (/ 1 0))

------ Buffer: *Backtrace* ------
Debugger entered--Lisp error: (arith-error)
  /(1 0)
...
------ Buffer: *Backtrace* ------

Если была сигнальная ошибка, предположительно, переменная debug-on-error не равна nil. Если был сигнал quit, то, вероятно, переменная debug-on-quit не равна nil.

nil

Используйте nil в качестве первого из debugger-args, когда вы хотите явно войти в отладчик. Остальные debugger-args печатаются в верхней строке буфера. Вы можете использовать эту функцию для отображения сообщений — например, чтобы напомнить себе об условиях, при которых вызывается debug.

Переменная: backtrace-on-error-noninteractive

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