跟踪emacs中的max-specpdl-size错误

时间:2009-08-24 13:54:14

标签: emacs elisp ropemacs

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

  

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

......我一直在非常随意的时刻得到它。在研究了这个之后,好像某个地方的一些elisp正在递归过深。是否有任何跟踪此问题的策略?对于实际造成这种情况的事情,我完全不知所措。

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

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

3 个答案:

答案 0 :(得分:20)

要追踪问题,可以试试这个:

(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,那么我发现跟踪它的最佳方式是二进制搜索(在你的.emacs中加一个错误(error "frog")或者某些东西,加载,测试,如果没有问题,将错误置于3/4,否则为1/4,重复...),或逐行(逐个区域)手动评估.emacs,在每个部分后进行测试。这些设置应该有所帮助。

答案 1 :(得分:3)

对我来说也没用。我发现 C-h + v 实际上max-specpdl-size根本没有被5更改为setq。然后我尝试用 M-x set-variable以交互方式设置它。这也没有改变它的价值。最后,我设法用 M-x customize-variable设置它。

顺便说一下,在我的系统max-specpdl-size上是140,因此很小。我不得不将它增加到1000,而不是为了获得回溯并进行调试,而是为了使它工作。

答案 2 :(得分:0)

该错误在报告发布10年后仍然存在,出现在XEmacs 21.4(补丁24)“ Standard C” [Lucid](x86_64-linux-gnu,Mule)中。我是从M-x 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并重新开始。仅退出并重新启动虚拟机无济于事。