Вызов отладчика
Здесь мы подробно описываем функцию debug, используемую для вызова отладчика.
- Команда: debug &rest debugger-args
-
Эта функция запускает отладчик. В интерактивных сеансах она переключается на буфер с именем *Backtrace* (или *Backtrace*<2>, если это второй рекурсивный вход в отладчик, и т. д.) и заполняет его информацией о стеке вызовов функций Lisp. Затем она запускает рекурсивное редактирование, отображая буфер трассировки стека в режиме Debugger. В пакетном режиме (в более общем случае, когда
noninteractiveне равноnil, см. Пакетный режим) эта функция выводит трассировку стека Lisp в стандартный поток ошибок. Привязкаbacktrace-on-error-noninteractiveкnilподавляет вывод трассировки стека в пакетном режиме; см. ниже.Команды режима Debugger c, d, j и r завершают рекурсивное редактирование; затем
debugпереключается обратно на предыдущий буфер и возвращается к тому, что вызвалоdebug. Это единственный способ, которым функцияdebugможет вернуться к своему вызывающему коду.Аргументы debugger-args нужны для того, чтобы
debugвыводила остальные аргументы в верхней части буфера *Backtrace*, чтобы пользователь мог их видеть. За исключением описанных ниже случаев, это единственный способ использования этих аргументов.Однако некоторые значения первого аргумента для
debugимеют особое значение. (Обычно эти значения используются только внутренними механизмами Emacs, а не программистами, вызывающимиdebug.) Ниже приведена таблица этих специальных значений:-
lambda -
Первый аргумент
lambdaозначает, чтоdebugбыла вызвана при входе в функцию, когдаdebug-on-next-callне равняласьnil. В верхней части буфера отладчик выводит строку «Вход в отладчик — вход в функцию:». debug-
Значение
debugв качестве первого аргумента означает, чтоdebugбыла вызвана при входе в функцию, для которой была включена отладка при входе. Отладчик выводит строку «Вход в отладчик — вход в функцию:», как и в случаеlambda. Кроме того, он помечает стековый кадр этой функции, чтобы вызвать отладчик при выходе из неё. t-
Если первый аргумент —
t, это означает, чтоdebugбыла вызвана при вычислении формы вызова функции, когдаdebug-on-next-callне равняласьnil. В первой строке буфера отладчик выводит «Вход в отладчик — начало вычисления формы вызова функции:». exit-
Если первый аргумент —
exit, это означает выход из стекового кадра, ранее помеченного для вызова отладчика при выходе. Второй аргумент, переданныйdebugв этом случае, — это значение, возвращаемое из кадра. В первой строке буфера отладчик выводит «Вход в отладчик — возвращаемое значение:», а следом — возвращаемое значение. -
error -
Если первый аргумент —
error, отладчик сообщает, что был запущен из-за того, что возникла ошибка или было вызваноquit, которые не были обработаны. Для этого он выводит «Вход в отладчик — ошибка Lisp:», а следом — возникшую ошибку и все аргументы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подавляет трассировку стека и выводит только сообщение об ошибке.
Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Invoking-the-Debugger.html