Подтвердить что ты не робот

Отслеживание ошибок max-specpdl-размера в emacs

Я случайно получил следующую ошибку в emacs:

Переменная глубина привязки превышает max-specpdl-size

... и я получаю его в очень случайные моменты. Изучив это, кажется, что какой-то elisp где-то слишком сильно рекурсивно. Существуют ли какие-либо стратегии для отслеживания этого? Я совершенно не понимаю, что на самом деле вызывает это.

У меня появились некоторые ошибки, указывающие что-то вдоль линий бесконечной рекурсии с ropemacs (но это, как правило, ошибки Python). Может быть что-то неправильно сконфигурировано с помощью ропемаков?

Обновить. Интересно, что я обнаружил, что всегда получаю эту ошибку, если я делаю "C-h a" для "speedbar", но не для "веревки".

4b9b3361

Ответ 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, а не для того, чтобы получить обратную трассировку и отладить ее, но чтобы она работала.