严重错误:SWI-Prolog中堆叠的字符串过多

问题描述

在64位win10上,当我使用swi-prolog时,发生以下致命错误

SWI-Prolog:[AATAL ERROR: at xx:xx:xx Too many stacked strings]

我该如何解决

事实集大约为150000,来自SWI-Prolog-8.2.1.pdf,我发现堆栈可以由设置,

swipl --stack-limit = 32G

但是当我执行此命令时,我不知道它是否正确,有人可以帮助我吗?

解决方法

“ AATAL ERROR”听起来与“ FATAL ERROR”非常相似

可能有一个简单的解释:

  1. 您是否正在使用swi-prolog的64位版本?
  2. 重新启动Windows,然后重试,您仍然收到相同的消息吗?
  3. 在运行测试代码之前,在运行时从SWI-Prolog中设置堆栈大小
:- set_prolog_stack(global,limit(100000000000)).
:- set_prolog_stack(trail,limit(20000000000)).
:- set_prolog_stack(local,limit(2000000000)).
  1. 在命令行上,使用以下等效命令:swipl -G100g -T20g -L2g

    ...

祝你好运!

,

请提供一些导致错误的已发布的pl代码, 以便其他人可以复制它 帮你。您甚至可以将其上传到 gist 或 GitHub 如果是 1000 个左右的事实。也许你需要匿名 它,因为隐私问题。 MAX_LG_STACKED_STRINGS 只是一个缓冲区。从 SWI-Prolog 源码可以看出,SWI-Prolog 确实有一个内部标志 ALERT_BUFFER。

所以我粗略的理解是有多个 MAX_LG_STACKED_STRINGS 在堆栈上。这意味着 增加这个常数并不能解决问题。 这只会增加一种块大小。而 致命错误可能是由其他问题引起的 和/或有重写代码的建议。在作为 到目前为止,它也可以在没有 Python 的情况下重现 界面和所有平台。也许也在 SWISH 里面。

不知道,不知道你在用字符串做什么,因为 没有已发布的测试用例。你也可以打开 MSG_STRING_BUFFER 调试器消息,这些消息告诉我 SWI-Prolog 使用多个缓冲区:

  DEBUG(MSG_STRING_BUFFER,Sdprintf("Discarding string buffers %d..%d\n",stack->top,stack->allocated));

   DEBUG(MSG_STRING_BUFFER,Sdprintf("Added string buffer entry %p with level %zd\n",sb,(size_t)sb->frame));

编辑 31.07.2021:
像这里的测试用例:

致命错误:堆叠的字符串太多#102
https://github.com/yuce/pyswip/issues/102