【问题标题】:Tracking down max-specpdl-size errors in emacs跟踪 emacs 中的 max-specpdl-size 错误
【发布时间】:2009-08-24 13:54:14
【问题描述】:

我在emacs中随机出现以下错误:

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

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

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

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

【问题讨论】:

    标签: emacs elisp ropemacs


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

    【讨论】:

    • 当然不是。希望 SO 在编辑时有一个“差异”实用程序,我想看看我在哪里搞砸了。
    • 你有debug-on-errot。如果您单击我的头像上方已编辑(例如“5 小时前”)旁边的链接,您可以看到差异。还是您的意思不同?
    • 我试过了,但没用:我把值调低到 5 并且调试错误 T,但是 emacs 并没有把我放到调试器中:相反它只是打印了通常的错误信息。这发生在错误出现在自动缩进函数中的地方,这会干扰调试错误吗?
    • 我碰到了这个(也在 python 编辑中)。 Emacs 不想缩进我写的东西。它看起来像一个完全正常的文件,并且在关闭重新加载周期时表现出同样的问题。我所拥有的只是一个导入,一个函数 def(它不会缩进之后)和一些伪代码 cmets,详细说明了我打算编写的内容。似乎是 python 模式或相关处理程序中的一个微妙错误。我现在似乎无法重现它。 . .所以它可能仍然是神秘的。在 c/p 重新排列 cmets 后,它开始工作。很奇怪吧?
    • @meawoppl FWIW,这种类型的错误在 python 模式下仍然存在,在原始报告后 5 年和最后评论后 2 年。我收到了py-end-of-statement: Variable binding depth exceeds max-specpdl-size 这正是我应该避免的那种鼠洞,但尝试追踪它非常诱人。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      这种错误在报告 10 年后仍然存在,在 XEmacs 21.4 (patch 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 并重新开始。只有退出并重新启动 vm 没有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-30
        • 2011-06-30
        • 2013-01-02
        • 1970-01-01
        • 2015-03-15
        • 2015-11-19
        相关资源
        最近更新 更多