Здесь мы подробно описываем функцию debug, которая используется
для вызова отладчика.
Эта функция входит в отладчик. В интерактивных сессиях она
переключается на буфер с именем *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:» как строку текста в верхней части
буфера.
debugdebug в качестве первого аргумента означает, что 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.
Если эта переменная не равна nil, по умолчанию, вход в
отладчик в пакетном режиме показывает трассировку вызовов функций Lisp. Привязка
переменной к значению nil подавляет трассировку и показывает
только сообщение об ошибке.