Spec-Zone.ru › Elisp

Внутренние механизмы отладчика

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

Переменная: 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API