如何修复 emacs 中的"stack overflow in regexp matcher"



我是Emacs的忠实粉丝,经常使用它,尤其是在编程和调试(使用gud((C/C++(时。

最近我不得不调试一个程序(相当简单,但计算了大量数据(图论((,但我遇到了一个相当烦人的问题。在程序的一步一步执行过程中,我得到了以下错误:

error in process filter: Stack overflow in regexp matcher

我做了一些研究来找出它是什么,我发现了这篇文章:在emacs中调试(使用gud(经常会导致堆栈溢出错误。

所以据我所知,regexp匹配器有问题,而且我的程序中有些东西太长了?(我确实有一个异常长的函数名,里面有很多参数,我也使用了异常大的容器。(

我真的很想解决这个问题,但我对调试Emacs Lisp一无所知,有人能帮我吗?

以下是我从Emacs内部debbuger获得的输出:http://pastebin.com/5CKe74e6

我还应该指出,我使用了Emacs前奏曲的个性化版本。

潜在的问题是正则表达式(regexp(包含太多替代项,当应用于(通常是长的(文本时,它无法匹配它试图匹配的任何内容。

在您的情况下,它是regexp:

"\([[:alnum:]-_]+\)=\({\|\[\|""\|"\(?:[^\"]\|\\.\)*"\)"

其由函数CCD_ 1使用。

看起来这个正则表达式试图匹配赋值。基本上,它匹配=左边的变量和右边的表达式(的一部分(。regexp似乎匹配的一件事是一个包含转义引号的字符串——这总是一个警告信号,因为Emacs提供了更好的解析字符串的方法。

这个问题可能源于以下事实:这个regexp是错误的(因此它比您的字符串匹配得更多(,您有一个格式错误的字符串,或者您的程序只是包含一个非常大的字符串。

我建议您向该包的维护人员提交一份错误报告。请确保包含导致触发错误的文本。

或者,你可以尝试自己解决这个问题。我建议您用一个更简单的正则表达式来替换复杂的正则表达式,它可以找到字符串的开头。然后,您可以使用例如(forward-sexp)来查找字符串的末尾。

我也遇到了这个问题,所以我使用了Lindydancer的建议,将字符串文字上的regexp转换为使用(forward-sexp(,它对我来说一直很好。

我已经发布了补丁:

http://lists.gnu.org/archive/html/bug-gnu-emacs/2017-12/msg00968.html

所以希望它能在某个时候合并。同时,您可以将其用于gdb-jsonify缓冲区:


(defun gdb-jsonify-buffer (&optional fix-key fix-list)
  "Prepare GDB/MI output in current buffer for parsing with `json-read'.
Field names are wrapped in double quotes and equal signs are
replaced with semicolons.
If FIX-KEY is non-nil, strip all "FIX-KEY=" occurrences from
partial output.  This is used to get rid of useless keys in lists
in MI messages, e.g.: [key=.., key=..].  -stack-list-frames and
-break-info are examples of MI commands which issue such
responses.
If FIX-LIST is non-nil, "FIX-LIST={..}" is replaced with
"FIX-LIST=[..]" prior to parsing. This is used to fix broken
-break-info output when it contains breakpoint script field
incompatible with GDB/MI output syntax.
If `default-directory' is remote, full file names are adapted accordingly."
  (save-excursion
    (let ((remote (file-remote-p default-directory)))
      (when remote
        (goto-char (point-min))
        (while (re-search-forward "[\[,]fullname="\(.+\)"" nil t)
          (replace-match (concat remote "\1") nil nil nil 1))))
    (goto-char (point-min))
    (when fix-key
      (save-excursion
        (while (re-search-forward (concat "[\[,]\(" fix-key "=\)") nil t)
          (replace-match "" nil nil nil 1))))
    (when fix-list
      (save-excursion
        ;; Find positions of braces which enclose broken list
        (while (re-search-forward (concat fix-list "={"") nil t)
          (let ((p1 (goto-char (- (point) 2)))
                (p2 (progn (forward-sexp)
                           (1- (point)))))
            ;; Replace braces with brackets
            (save-excursion
              (goto-char p1)
              (delete-char 1)
              (insert "[")
              (goto-char p2)
              (delete-char 1)
              (insert "]"))))))
    (goto-char (point-min))
    (insert "{")
    (let ((re (concat "\([[:alnum:]-_]+\)=")))
      (while (re-search-forward re nil t)
        (replace-match ""\1":" nil nil)
        (if (eq (char-after) ?") (forward-sexp) (forward-char))))
    (goto-char (point-max))
    (insert "}")))

相关内容

  • 没有找到相关文章

最新更新