Наиболее важный момент для входа в отладчик — это возникновение ошибки Lisp. Это позволяет вам исследовать непосредственные причины ошибки.
Однако вход в отладчик не является обычным следствием ошибки.
Многие команды сигнализируют об ошибках Lisp при некорректном вызове,
и во время обычного редактирования было бы крайне неудобно входить в отладчик
при каждом таком случае. Поэтому, если вы хотите, чтобы ошибки вызывали вход в отладчик,
установите переменную debug-on-error в значение, отличное от nil.
(Команда toggle-debug-on-error предоставляет простой способ сделать это.)
Обратите внимание, что по техническим причинам вы не можете использовать средства, описанные в этом подразделе, для отладки ошибок в Lisp, которые были вызваны кодом перерисовки. См. Отладка ошибок при перерисовке для помощи с ними.
Эта переменная определяет, вызывается ли отладчик, когда ошибка
сигнализируется и не обрабатывается. Если debug-on-error равен t,
все виды ошибок вызывают отладчик, кроме тех, что перечислены в
debug-ignored-errors (см. ниже). Если он равен nil, отладчик
не вызывается ни для каких ошибок.
Значение также может быть списком условий ошибок (см. Как сигнализировать об ошибке).
Тогда отладчик вызывается только для условий ошибок из этого списка
(кроме тех, что также перечислены в debug-ignored-errors).
Например, если вы установите debug-on-error в список
(void-variable), отладчик будет вызываться только для ошибок о
переменной, у которой нет значения.
Обратите внимание, что eval-expression-debug-on-error переопределяет
эту переменную в некоторых случаях; см. ниже.
Когда эта переменная не равна nil, Emacs не создает обработчик ошибок
вокруг функций фильтров процессов и сторожей. Поэтому ошибки в этих
функциях также вызывают отладчик. См. Процессы.
Эта переменная определяет ошибки, которые не должны вызывать вход в отладчик,
независимо от значения debug-on-error. Её значение — это список
символов условий ошибок и/или регулярных выражений. Если ошибка имеет
любой из этих символов условий или если сообщение об ошибке совпадает
с любым из регулярных выражений, то эта ошибка не вызывает отладчик.
Обычное значение этой переменной включает user-error, а также
несколько ошибок, которые часто возникают во время редактирования, но редко
являются следствием ошибок в программах на Lisp. Однако «редко» — это не
«никогда»; если ваша программа завершается с ошибкой, которая совпадает
с этим списком, вы можете попробовать изменить этот список для отладки
ошибки. Проще всего обычно установить debug-ignored-errors в nil.
Если эта переменная имеет значение, отличное от nil (по умолчанию так),
выполнение команды eval-expression приводит к временной привязке
debug-on-error к t. См. Вычисление
выражений Emacs Lisp в Руководстве по GNU Emacs.
Если eval-expression-debug-on-error равен nil, то значение
debug-on-error не изменяется во время eval-expression.
Обычно ошибки, перехваченные condition-case, никогда не вызывают
отладчик. condition-case получает шанс обработать ошибку до того,
как отладчик получит этот шанс.
Если вы измените debug-on-signal на значение, отличное от nil,
отладчик получает первый шанс при каждой ошибке, независимо от наличия
condition-case. (Чтобы вызвать отладчик, ошибка всё равно должна
удовлетворять критериям, заданным debug-on-error и
debug-ignored-errors.)
Например, установка этой переменной полезна для получения обратной трассировки
из кода, вычисляемого по опции --eval emacsclient. Если код Lisp,
вычисляемый emacsclient, сигнализирует об ошибке, пока эта переменная не равна
nil, обратная трассировка появится в запущенном Emacs.
Предупреждение: Установка этой переменной в значение, отличное от nil,
может иметь неприятные последствия. Различные части Emacs перехватывают ошибки
в обычном ходе работы, и вы можете даже не осознавать, что там происходят ошибки.
Если вам нужно отлаживать код, обёрнутый в condition-case,
рассмотрите использование condition-case-unless-debug (см. Написание кода для обработки ошибок).
Если вы установите debug-on-event в специальное событие (см. Специальные события), Emacs попытается войти в отладчик, как только получит это событие,
в обход special-event-map. В настоящее время единственными
поддерживаемыми значениями являются сигналы SIGUSR1 и
SIGUSR2 (это значение по умолчанию). Это может быть полезно, когда
установлен inhibit-quit и Emacs иным образом не отвечает.
Если вы установите debug-on-message в регулярное выражение,
Emacs войдёт в отладчик, если он отобразит сообщение, совпадающее с этим
выражением, в области эхо. Например, это может быть полезно при попытке
найти причину конкретного сообщения.
Вы можете вычислять формы в текущем кадре стека в буфере
‘*Backtrace*’ с помощью команды e, а во время отладки
edebug вы можете использовать команды e и C-x C-e для
выполнения аналогичных действий. По умолчанию отладчик запрещён для этих
команд (поскольку (повторный) вход в отладчик в этот момент обычно выведет
вас из контекста отладки, в котором вы находитесь). Установите
debug-allow-recursive-debug в значение, отличное от nil,
чтобы разрешить этим командам входить в отладчик рекурсивно.
Для отладки ошибки, возникающей во время загрузки файла инициализации,
используйте опцию ‘--debug-init’. Она привязывает
debug-on-error к t во время загрузки файла инициализации
и обходит condition-case, который обычно перехватывает ошибки в
файле инициализации.