Spec-Zone.ru › Elisp

Вход в отладчик при возникновении ошибки

Самый важный момент для входа в отладчик — возникновение ошибки 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

Spec-Zone.ru

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