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