首页 > 解决方案 > Open Cobol 中的堆栈溢出

问题描述

我正在使用 Open Cobol。我有一个已经运行了几个星期的程序。昨天,我收到以下错误:

MERRILL_MAX_AMOUNTS.COB:46:libcob:堆栈溢出,可能超出 PERFORM 深度

我尝试返回到相同程序的其他版本,但我仍然遇到同样的错误。我还有其他几个运行良好的程序没有问题。

标签: gnucobol

解决方案


如果程序运行了几个星期,然后以这个错误结束,程序似乎被破坏了。

如果PERFORM编辑了一个部分/段落,然后(可能在一堆其他语句可能包括GO TOPERFORMing 那里的其他部分/段落之后)又是“PERFORM”本身(递归地),则会出现该错误。
在大多数情况下,这是一个错误。

如果同一个程序“以前工作过”而现在没有工作,那么它的程序流程就会改变,可能是因为正在处理不同的数据。

您可以通过添加到该单个程序并根据运行时文档-ftrace调整 runtime.cfg/export/set来启用该单个程序的段落和部分的跟踪。COB_SET_TRACECOB_TRACE_FILE

注意:PERFORM堆栈检查仅在请求时启用,通过(所有运行时检查)或(调试)-fstack-check自动启用- 如果您不希望这样做,您可以通过显式指定来禁用它。 您还可以调整 libcob 认为“可能安全”的迭代次数,当前默认值 255 相当高,当前版本中可以设置的最大值为 512(仅限人为限制)。--debug-g-fno-stack-check
-fstack-size=number

无论如何,我强烈建议用当前的 GnuCOBOL 版本(19 天前的最新 3.1-rc1)替换过时的 OpenCOBOL(可能是 2009 年 2 月的 1.1)。


推荐阅读