【问题标题】:CICS transaction not releasing resources when it finishesCICS 事务在完成时未释放资源
【发布时间】:2016-04-11 09:31:57
【问题描述】:

我正在尝试查找 CICS 事务中的内存泄漏。该事务运行一个 Cobol 程序,该程序调用一个 C DLL,该 DLL 连接到一个套接字、多个 malloc,然后断开连接并释放内存。

此事务正在泄漏内存,但它在停止时也不会释放任何内存。我已经仔细匹配了所有的 malloc 和 frees(以及 getaddrinfo / freeaddrinfo),并且我在 CICS 之外测试了相同的 cobol 程序并且它没有泄漏。

哪些 CICS 设置将确保在事务返回时释放资源?还有什么技巧可以调试内存泄漏吗?如果不是 malloc,它还能是什么?我注意到 TCPIP getaddrinfo / freeaddrinfo 正在记录到 SYSTCPT,这是使用 CICS 区域空间吗?

【问题讨论】:

    标签: cics


    【解决方案1】:

    CICS releases storage 由在语言环境 (LE) enclave 终止处的事务下运行的代码分配。如果 C DLL 不将 LE 用于其运行时,那么您将受到 C DLL 正在使用的任何运行时的行为的支配。

    您提到使用套接字。如果 C DLL 不是 compiled and linked 来使用 CICS 套接字接口,那么您将受到 C DLL 使用的任何运行时行为的支配。

    您的 CICS Sysprog 可以使用 CLER 事务动态修改 LE 运行时选项。 RPTSTG 选项可能显示有用的信息。

    您的 CICS Sysprog 可以使用 CETR 事务启动存储管理跟踪。这可能揭示有用的信息。

    我说可能揭示有用的信息,因为如果您的 C DLL 没有在其运行时使用 LE,那么这些技术可能对您没有帮助。

    【讨论】:

    • C DLL 是用 CICS Sockets 编译的,它确实使用 LE。
    • RPTSTG 显示 HEAP 设置为 HEAP(4096,4080,ANYWHERE,KEEP,4096,4080)。
    • @MichaelTaylor 让您的 CICS SYSPROG 为您运行和解释跟踪。
    • 所以经过大量测试,我认为这是这个错误www-01.ibm.com/support/docview.wss?uid=isg1PK98008 - 我们的连接代码使用 getaddrinfo() 并且由于错误,freeaddrinfo 没有释放它!
    • 这似乎是那个错误 - 所以问题不在于代码,而在于 CICS TCPIP 库。
    【解决方案2】:

    所以答案是我们的 z/OS 和 CICS 版本的 CICS TCPIP 库中存在错误。必须链接到您的代码的模块 EZACIC17 有一个错误,其中 getaddrinfo() 错误地标记了它分配的结构。当您调用 freeaddrinfo() 时,不会释放此内存,最终,CICS 区域会耗尽存储空间。我们的开发系统是 z/OS 1.8,而 CICS 是 V3.1,并且没有针对该版本的修复,因此我们需要升级。

    使用 malloc() 分配的 C 程序中的所有内存将在使用 free() 释放时释放。但是,当应用程序/事务完成时,不会返回任何未显式释放的资源。 Out 应用程序使用似乎留在内存中的 C DLL。当您再次运行应用程序时,CICS 使用的内存总量保持不变。所以只要它们没有内存泄漏,我们的代码 CICS 内存使用量就不会增加。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-21
      • 2016-07-01
      • 1970-01-01
      • 2013-08-20
      • 1970-01-01
      • 2015-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多