32

我在emacs中随机收到以下错误:

可变绑定深度超过 max-specpdl-size

...而且我一直在非常随机的时刻得到它。在对此进行研究之后,似乎某个地方的某些 elisp 递归得太深了。有什么策略可以追踪到这一点吗?就实际造成这种情况的原因而言,我完全不知所措。

我收到了一些错误,表明使用ropemacs 进行无限递归(但这些通常是Python 错误)。使用ropemacs可能会配置错误吗?

更新:有趣的是,我发现如果我为“speedbar”而不是“rope-”执行“Ch a”,我总是会收到此错误。

4

3 回答 3

23

要跟踪问题,您可以尝试以下操作:

(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 -q)的情况下加载 emacs,以查看 .emacs 中是否存在影响事物的内容。(我没有使用无限循环C-h a)。如果它是你的 .emacs,那么我找到的最好的追踪方法是二进制搜索((error "frog")在你的 .emacs 中间放一个错误或类似的东西,加载,测试,如果没有问题,把错误放在3/4,否则在 1/4,重复...),或逐行(逐个区域)手动评估您的 .emacs,在每个部分之后进行测试。这些设置应该会有所帮助。

于 2009-08-24T15:11:25.940 回答
3

对我来说也是行不通的。我发现 with C-h+v实际上max-specpdl-size并没有5setq. 然后我尝试使用M-x set-variable. 这也没有改变它的价值。最后我设法用M-x customize-variable.

顺便说一句,在我的系统 max-specpdl-size140很小。我不得不将它增加到1000,不是为了获得回溯和调试它,而是让它工作。

于 2012-10-10T12:25:02.560 回答
0

报告 10 年后,在 XEmacs 21.4 (patch 24) "Standard C" [Lucid] (x86_64-linux-gnu, Mule) 中仍然存在这种错误。我从 Mx vm 得到它(试图阅读我的电子邮件,我每天都会这样做很多次)。

Debugger entered--Lisp error: (error "Variable binding depth exceeds max-specpdl-size")
  signal(error ("Variable binding depth exceeds max-specpdl-size"))
  byte-code("..." [buf data kill-buffer signal] 3)
  find-file-noselect("/home/brech/mail/folders/INBOX")
  byte-code("..." [f full-startup access-method remote-spec buffer-file-coding-system folder string-match imap pop bufferp nil vm-pop-find-spec-for-name error "No such POP folder: %s" vm-pop-make-filename-for-spec t file-exists-p (rename-file f-pass f-nospec) ((error)) (rename-file f-nopass f-nospec) ((error)) 3 vm-imap-parse-spec-to-list vm-imap-make-filename-for-spec expand-file-name file-directory-p "%s is a directory" vm-get-file-buffer no-conversion raw-text message "Reading %s..." find-file-noselect "Reading %s... done" (pop imap) buffer-name rename-buffer set-buffer-multibyte get-coding-system no-conversion-unix no-conversion-dos no-conversion-mac binary buffer-modified-p ((set-buffer-modified-p omodified)) encode-coding-region set-buffer-file-coding-system decode-coding-region coding-system-base raw-text-unix ...] 9)
  ad-Orig-vm(nil nil nil)
  (setq ad-return-value (ad-Orig-vm folder read-only access-method))
  (let (ad-return-value) (if (and ... mail-archive-file-name folder ... ...) (setq read-only ...)) (setq ad-return-value (ad-Orig-vm folder read-only access-method)) ad-return-value)
  (lambda (&optional folder read-only access-method) "$ad-doc: vm$" (interactive (list nil current-prefix-arg)) (let (ad-return-value) (if ... ...) (setq ad-return-value ...) ad-return-value))(nil nil)
  call-interactively(vm)
  command-execute(vm t)
  execute-extended-command(nil)
  call-interactively(execute-extended-command)

一个粗略的解决方法是退出 XEmacs 并重新开始。只有退出并重新启动 vm 无济于事。

于 2020-06-29T10:37:19.247 回答