Установка точки останова в работающей программе Emacs Lisp
Вопрос
У меня проблема с пакетом Emacs lisp, который я извлек из дистрибутива Ubuntu.Пакет JDEE, и он жалуется на Args out of range: "63", 0, 4
в мини-буфере и *Messages*
буфер всякий раз, когда я открываю файл.Об этой ошибке сообщалось в сентябре прошлого года, но никаких действий предпринято не было.Я не новичок в emacs, сам написал некоторый код на Elisp, но никогда не пытался отлаживать что-то подобное.Я хотел бы остановить загрузку файла в отладчике, когда произойдет эта ошибка, чтобы хотя бы понять, откуда возникла проблема.Я прочитал раздел 18.1.1 руководства Elisp «Вход в отладчик при ошибке», но пытаюсь загрузить файл после игры с различными комбинациями значений для debug-on-error
, debug-ignored-errors
, и debug-on-signal
похоже, не имеет никакого эффекта.Есть ли у кого-нибудь предложения относительно моего следующего шага?
Решение
Если отладка при ошибке не работает, я бы начал с самого источника.Найдите сочетание клавиш/событие, вызывающее проблему, и найдите функцию.
C-h k <keystrokes>
M-x find-function <function-name-from-above>
Теперь, когда вы находитесь у источника
M-x edebug-defun
И в следующий раз, когда вы нажмете клавишу, вы сможете пройти программу.На этом этапе вы можете увидеть, какая часть вызывает ошибку, и углубиться в нее.
Вы также можете попробовать установить переменную 'stack-trace-on-error
посмотреть, сможете ли вы найти виновника (хотя 'debug-on-error
у меня обычно работает, не знаю, почему у вас нет).
В крайнем случае (если edebug-defun
не работает), вы можете переопределить процедуру, вызвав (debug)
в нем вроде то же самое.
Другие советы
Я полагаю, что JDEE каким-то образом препятствует отладке при ошибке.Возможно, grep просматривает свои файлы и выдает сообщение об ошибке «Args вне диапазона».Во время отладки обязательно загружайте нескомпилированный файл. .el
файлы, а не скомпилированные побайтно .elc
файлы (вы заметите это в отладчике, если используете байт-скомпилированный код), вводя такие команды, как (load "foo.el")
вместо (load "foo")
.
Я получил ту же ошибку при использовании find-grep
после случайного переопределения (current-time-string)
в одном из моих собственных сценариев.
Используя M-x edebug-defun
совет, опубликованный выше. Мне удалось найти проблему, когда я прошел через код, выдавая ошибку при просмотре вызова (current-time-string)
.
Не уверен, насколько это полезно в вашем случае.