进度警告:在过程中超出 -s 堆栈。那是啥意思?

Posted

技术标签:

【中文标题】进度警告:在过程中超出 -s 堆栈。那是啥意思?【英文标题】:Progress Warning: -s stack exceeded during procedure. What does that mean?进度警告:在过程中超出 -s 堆栈。那是什么意思? 【发布时间】:2021-12-23 22:46:30 【问题描述】:

我遇到了以前从未见过的警告。

这是我在运行简单程序时收到的消息:

我的程序如下:

    从文件中读取ReferenceNumbersfor each 中使用那些ReferenceNumbers 更改Info 字段的值

这是它在代码中的样子:

INPUT FROM VALUE('C:\Users\admin\Desktop\ref\reference.csv').

DEFINE VARIABLE cData AS CHARACTER NO-UNDO.

repeat:
    if keyfunction(lastkey) = "end-error" then leave.
    process events.

    import unformatted cData.

    FOR EACH V_Acct
        WHERE V_Acct.Company = '123'
            AND V_Acct.ReceiptType = 'U'
            AND V_Acct.ReferenceNr = integer(TRIM(ENTRY(1,cData,';')))
            AND V_Acct.xInfo = ''
        EXCLUSIVE-LOCK:
        
        V_Acct.xInfo = 'VGF00000000000000'.

    END. /* for each V_Acct */                                     

END. /* repeat */

从文件中正确读取参考编号(多次确认)。 我过去也更改过同一个数据库表的某些文件,但从未遇到过此错误消息。

有人可以帮我吗?

【问题讨论】:

【参考方案1】:

一个常见的原因是尝试使用长字符变量。 IOW 你可能试图 IMPORT 很长的一行。

https://knowledgebase.progress.com/articles/Article/P79111

-s 并不特定于单个变量(字符变量的限制为 30,000 字节),而是涉及堆栈空间的多种不同用途。所以可能只是因为其他原因你接近了极限,这把你推到了边缘。

-s 的默认值会随时间变化,具体取决于您使用的 OpenEdge 版本,您的应用程序或特定会话也可能设置了更高或更低的非默认值。如果生成了一个 protrace 文件,它会告诉您问题发生时有效的 -s 值。

查找一个名为 protrace.###(其中 ### 是您的进程 ID)的文件,其时间戳与错误相同。这可能在当前工作目录或应用程序的 WRKDIR 中。

【讨论】:

以上是关于进度警告:在过程中超出 -s 堆栈。那是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

script error!是啥意思?

非递归过程中超出递归限制

TeamCity 说在 MSBuild 步骤中使用“构建参数”而不是“/property:”。那是啥意思?

在堆栈中 MoveNext 的前缀是啥意思?

堆栈和堆溢出利用是啥意思

“检测到所需的基于文件名的自动模块”是啥意思。警告是啥意思?