1

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

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

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

4

2 回答 2

1

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

你提到使用套接字。如果 C DLL 没有被编译和链接以使用 CICS 套接字接口,那么您将受到 C DLL 正在使用的任何运行时的行为的支配。

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

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

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

于 2016-04-11T15:00:24.797 回答
0

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

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

于 2016-04-13T22:23:04.920 回答