Отслеживание ошибок max-specpdl-размера в emacs
Я случайно получил следующую ошибку в emacs:
Переменная глубина привязки превышает max-specpdl-size
... и я получаю его в очень случайные моменты. Изучив это, кажется, что какой-то elisp где-то слишком сильно рекурсивно. Существуют ли какие-либо стратегии для отслеживания этого? Я совершенно не понимаю, что на самом деле вызывает это.
У меня появились некоторые ошибки, указывающие что-то вдоль линий бесконечной рекурсии с ropemacs (но это, как правило, ошибки Python). Может быть что-то неправильно сконфигурировано с помощью ропемаков?
Обновить. Интересно, что я обнаружил, что всегда получаю эту ошибку, если я делаю "C-h a" для "speedbar", но не для "веревки".
Ответы
Ответ 1
Чтобы отследить проблему, вы можете попробовать следующее:
(setq max-specpdl-size 5) ; default is 1000, reduce the backtrace level
(setq debug-on-error t) ; now you should get a backtrace
C-h a ; in speedbar
Вы должны получить обратную трассировку при ошибке, и в этот момент вы можете отслеживать процедуру нарушения.
Я также попробую загрузить emacs без вашего файла конфигурации (emacs -q
), чтобы узнать, есть ли что-то в ваших .emacs, которые влияют на вещи. (Я не получаю бесконечный цикл, используя C-h a
). И если это ваш .emacs, то лучшим способом, который я нашел для отслеживания этого, является либо двоичный поиск (поместите ошибку (error "frog")
, либо somesuch в середине вашего .emacs, загрузите, проверьте, если нет проблем, поставьте ошибка на 3/4, иначе на 1/4, повторить...) или вручную оценить ваши .emacs по строкам (по регионам), тестирование после каждой части. Эти настройки должны помочь.
Ответ 2
Для меня это тоже не сработало. Я нашел с C-h + v, что на самом деле max-specpdl-size
вообще не был изменен на 5
на setq
. Затем я попытался установить его в интерактивном режиме с помощью M-x set-variable
. Это тоже не изменило его значение. Наконец, мне удалось установить его с помощью M-x customize-variable
.
Btw, на моей системе max-specpdl-size
был 140
и, следовательно, мал. Мне пришлось увеличить его до 1000
, а не для того, чтобы получить обратную трассировку и отладить ее, но чтобы она работала.