2009-08-24 3 views
23

Я случайно получаю следующее сообщение об ошибке в Emacs:Отслеживание ошибок макс-specpdl размера в Emacs

переменной связывания глубина превышает максимально-specpdl-размер

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

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

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

ответ

16

Чтобы отслеживать проблемы вниз, вы можете попробовать это:

(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 по строкам (по регионам), тестирование после каждой части. Эти настройки должны помочь.

+0

Конечно нет. У Wish SO была утилита «diff» во время редактирования, я хотел посмотреть, с чем я столкнулся. –

+0

У вас был 'debug-on-errot'. Если вы нажмете на ссылку рядом с отредактированным (например, «5 часов назад») над моим гравитаром, вы увидите разницу. Или вы имеете в виду что-то другое? – seth

+0

Я пробовал это, и он не работал: я изменил значение до пяти и имел debug-on-error T, но emacs не отбросил меня в отладчик: вместо этого он просто распечатал обычное сообщение об ошибке. Это произошло там, где ошибка в функции автоотделания, может ли это мешать ошибке debug-on-error? –

2

Для меня это тоже не сработало. Я нашел с C-h + v что фактически max-specpdl-size не был изменен на 5 вообще setq. Затем я попытался установить его в интерактивном режиме с помощью M-xset-variable. Это тоже не изменило его значение. Наконец мне удалось установить его с помощью M-xcustomize-variable.

Btw, в моей системе max-specpdl-size было 140 и, следовательно, маленькому. Мне пришлось увеличить его до 1000, а не для того, чтобы получить обратную трассировку и отладить ее, но чтобы она работала.

Смежные вопросы