Скажем, что Emacs выдает ошибку, которую я не понимаю. Или, возможно, ошибка говорит: «Значение символа как переменной - void: mode», но modes
в моем коде встречается много символов , поэтому мне нужен некоторый контекст. Можно ли настроить Emacs для указания номера строки кода lisp, чтобы я мог знать, какой код вызывает ошибку?
Я попытался сделать (setq stack-trace-on-error '(buffer-read-only))
и запустил исполняющий код, чтобы получить трассировку стека. Нет трассировки стека либо.
Я также попытался вызвать edebug-defun
свою функцию и пройти через нее. Только когда я выхожу из функции, появляется ошибка.
(Я на самом деле не так интересуюсь причиной конкретной ошибки, с которой я сталкиваюсь в настоящее время, поскольку я занимаюсь разработкой общих навыков отладки для elisp. Пожалуйста, посоветуйте, как я могу подсвечивать номер строки, или sexp, или трассировку стека из ошибка.)
nil
debug-on-error
? Разве это не помогает?t
а затем приступил к оценке функции, генерирующей ошибки.)debug-ignored-errors
не перечисляет никаких ошибок. Если вы установилиdebug-on-signal
non-nil
, и это был случай, когда другой код обрабатывал ошибку, вы сможете получить ошибку раньше, чем другой код.Ответы:
Emacs обеспечивает хорошее количество средств отладки , включая
M-x toggle-debug-on-error
,M-x toggle-debug-on-quit
, отлаживать на сигнал (который может быть использован, посылаяUSR2
в Emacs извне),debug-on-entry
(из функции),debug-on-message
(при виде конкретных регулярное выражение матч сообщения) и , наконец,debug
в качестве альтернативы чтобы оснастить функцию сC-u C-M-x
.И то,
debug
и другоеedebug
предлагает достаточно функций для проверки состояния Emacs при оценке кода, который вас интересует, нажмитеe
и введите выражение.Однако, хотя
edebug
переходит к месту в инструментальной функции и, следовательно, дает вам подсказку, где искать (что довольно глупо, поскольку вы уже знаете, что именно вы инструментировали), этоdebug
вообще не делается. Я выполнил небольшой хак, обнаружив, что всякий раз, когдаdebug
оценивается буфер, он выдает значение точки, связанной с ошибкой; другими словами, использование этой информации в буфере может дать вам номер строки в обратном следе!При этом следует ответить на оригинальный вопрос в названии. Что касается вашей проблемы с получением обратного следа, то у меня нет полезных идей.
источник
M-x debug
...? Тогда что я нажимаю?debug
, вы можете проверить, посетив неисправный файл elisp, выполнив командуM-x toggle-debug-on-error
иM-x eval-buffer
, затем должна появиться обратная трассировка с номером строки в проблемной позиции.eval-buffer
? Например, если вы просто нажмете комбинацию клавиш, которая запускает частную команду, которая не работает и открывает отладчик в*Backtrace*
буфере.Может быть, потому что сейчас 2018, но в моем случае мне нужно было только включить отладку, как предложил васамаса: Mx toggle-debug-on-error
После этого Mx eval-buffer в моем неисправном файле Elisp предоставил контекст, указав позицию ошибки, например:
Debugger entered--Lisp error: (invalid-read-syntax ")") eval-buffer() ; Reading at buffer position 523 [....]
Mx goto-char переходит в позицию ошибки:
M-x goto-char 523
источник
Я расширил ответ Васамасы, включив в него дополнительную информацию:
источник