如何在emacs中修复"regexp matcher中的堆栈溢出"

Alk*_*aze 9 regex debugging emacs gdb gud

我是Emacs的忠实粉丝,并且经常使用它,特别是在编程和调试时(使用gud)(C/C++).

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

error in process filter: Stack overflow in regexp matcher
Run Code Online (Sandbox Code Playgroud)

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

据我了解,正则表达式匹配器存在问题,而且程序中的某些内容太长了?(我确实有很多参数的异常长的函数名称,我也使用异常大的容器.)

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

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

我还应该指出,我使用的是个性化版本的Emacs Prelude.

Lin*_*cer 4

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

在你的情况下,它是正则表达式:

"\\([[:alnum:]-_]+\\)=\\({\\|\\[\\|\"\"\\|\"\\(?:[^\\\"]\\|\\\\.\\)*\"\\)"
Run Code Online (Sandbox Code Playgroud)

函数使用哪个gdb-jsonify-buffer

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

问题可能源于以下事实:此正则表达式是错误的(因此它匹配的字符串比您的字符串多得多)、您的字符串格式不正确,或者您的程序仅包含一个非常大的字符串。

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

或者,您可以尝试自己修复此问题。我建议您将复杂的正则表达式替换为更简单的正则表达式,以查找字符串的开头。例如,您可以使用它来(forward-sexp)查找字符串的结尾。