Внутренние механизмы отладчика
Этот раздел описывает функции и переменные, используемые внутренним образом отладчиком.
- Переменная: debugger
-
Значение этой переменной — функция, вызываемая для запуска отладчика. Ее значение должно быть функцией с любым количеством аргументов или, как правило, именем функции. Эта функция должна вызывать какой-либо отладчик. Значение по умолчанию этой переменной —
debug.Первый аргумент, который Lisp передаёт функции, указывает причину её вызова. Конвенция для аргументов подробно описана в описании
debug(см. Вызов отладчика).
- Функция: backtrace
-
Эта функция выводит трассировку вызовов функций Lisp, которые в данный момент активны. Трассировка идентична той, которую
debugотображал бы в буфере *Backtrace*. Возвращаемое значение всегда nil.В следующем примере выражение Lisp явно вызывает
backtrace. Это печатает трассировку вызовов в потокstandard-output, который в данном случае является буфером ‘backtrace-output’.Каждая строка трассировки вызовов представляет один вызов функции. Строка отображает функцию, за которой следует список значений аргументов функции, если они все известны; если они ещё вычисляются, строка состоит из списка, содержащего функцию и её неуточнённые аргументы. Длинные списки или глубоко вложенные структуры могут быть опущены.
(with-output-to-temp-buffer "backtrace-output" (let ((var 1)) (save-excursion (setq var (eval '(progn (1+ var) (list 'testing (backtrace)))))))) ⇒ (testing nil)----------- Buffer: backtrace-output ------------ backtrace() (list 'testing (backtrace))
(progn ...) eval((progn (1+ var) (list 'testing (backtrace)))) (setq ...) (save-excursion ...) (let ...) (with-output-to-temp-buffer ...) eval((with-output-to-temp-buffer ...)) eval-last-sexp-1(nil)
eval-last-sexp(nil) call-interactively(eval-last-sexp) ----------- Buffer: backtrace-output ------------
- Пользовательский параметр: debugger-stack-frame-as-list
-
Если эта переменная не
nil, каждая кадр стека трассировки вызовов отображается как список. Это направлено на улучшение читабельности трассировки вызовов за счёт того, что специальные формы больше не визуально отличаются от обычных вызовов функций.При
debugger-stack-frame-as-listнеnil, вышеприведённый пример выглядел бы следующим образом:----------- Buffer: backtrace-output ------------ (backtrace) (list 'testing (backtrace))
(progn ...) (eval (progn (1+ var) (list 'testing (backtrace)))) (setq ...) (save-excursion ...) (let ...) (with-output-to-temp-buffer ...) (eval (with-output-to-temp-buffer ...)) (eval-last-sexp-1 nil)
(eval-last-sexp nil) (call-interactively eval-last-sexp) ----------- Buffer: backtrace-output ------------
- Переменная: debug-on-next-call
-
Если эта переменная не
nil, она говорит о вызове отладчика перед следующимeval,applyилиfuncall. Вход в отладчик устанавливаетdebug-on-next-callвnil.Команда d в отладчике работает, устанавливая эту переменную.
- Функция: backtrace-debug level flag
-
Эта функция устанавливает флаг debug-on-exit кадра стека level уровней вниз по стеку, присваивая ему значение flag. Если flag не
nil, это заставит отладчик войти, когда этот кадр позже выйдет. Даже нелокальный выход через этот кадр запустит отладчик.Эта функция используется только отладчиком.
- Переменная: command-debug-status
-
Эта переменная записывает статус отладки текущей интерактивной команды. Каждый раз, когда команда вызывается интерактивно, эта переменная привязывается к
nil. Отладчик может установить эту переменную, чтобы оставить информацию для последующих вызовов отладчика во время того же вызова команды.Преимущества использования этой переменной вместо обычной глобальной переменной заключаются в том, что данные никогда не будут переноситься в последующий вызов команды.
Эта переменная устарела и будет удалена в будущих версиях.
- Функция: backtrace-frame frame-number &optional base
-
Функция
backtrace-frameпредназначена для использования в отладчиках Lisp. Она возвращает информацию о том, что происходит в кадре стека frame-number уровней вниз.Если этот кадр ещё не вычислил аргументы или представляет собой специальную форму, значение равно
(nil function arg-forms…).Если этот кадр уже вычислил свои аргументы и вызвал свою функцию, возвращаемое значение равно
(t function arg-values…).В возвращаемом значении function — это то, что было передано в качестве CAR вычисленного списка или
lambdaвыражение в случае вызова макроса. Если функция имеет&restаргумент, это представляется в виде хвоста списка arg-values.Если base указано, frame-number считает относительно самого верхнего кадра, у которого function равен base.
Если frame-number вне диапазона,
backtrace-frameвозвращаетnil.
- Функция: mapbacktrace function &optional base
-
Функция
mapbacktraceвызывает function один раз для каждого кадра в трассировке вызовов, начиная с первого кадра, у которого функция равна base (или сверху, если base опущено илиnil).function вызывается с четырьмя аргументами: evald, func, args и flags.
Если кадр ещё не вычислил свои аргументы или представляет собой специальную форму, evald равно
nilи args — список форм.Если кадр уже вычислил свои аргументы и вызвал свою функцию, evald равно
tи args — список значений. flags — список свойств текущего кадра: в настоящее время единственное поддерживаемое свойство —:debug-on-exit, которое равноt, если флагdebug-on-exitкадра стека установлен.
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/Internals-of-Debugger.html