我是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 "}")))