我正在尝试查找CICS事务中的内存泄漏。该事务运行一个Cobol程序,该程序调用一个C DLL,该C DLL连接到一个套接字,许多错误锁,然后断开连接并释放内存。
此事务正在泄漏内存,但它在停止时也不会释放任何内存。我仔细地匹配了所有的malloc和frees (以及getaddrinfo / freeaddrinfo),并且我在CICS之外测试了相同的cobol程序,它没有泄漏。
哪些CICS设置将确保在事务返回时释放资源?另外,有没有调试内存泄漏的技巧呢?如果不是mallocs,还能是什么呢?我注意到TCPIP getaddrinfo / freeaddrinfo正在被记录到SYSTCPT中,这是在使用CICS区域空间吗?
发布于 2016-04-11 23:00:25
由在语言环境(LE) enclave终止的事务下运行的代码分配的CICS releases storage。如果C DLL不使用LE作为其运行时,那么您将受制于C DLL正在使用的任何运行时的行为。
您提到使用套接字。如果C DLL没有使用compiled and linked来使用CICS Sockets Interface,那么您将受到C DLL所使用的任何运行时行为的支配。
您的CICS Sysprog可以使用CLER事务动态修改LE运行时选项。RPTSTG选项可能会揭示有用的信息。
您的CICS Sysprog可以使用CETR事务启动存储管理跟踪。这可能会揭示有用的信息。
发布于 2016-04-14 06:23:05
因此,答案是我们的z/OS和CICS版本上的CICS TCPIP库中存在一个bug。必须链接到您的代码的模块EZACIC17有一个错误,其中getaddrinfo()错误地标记了它分配的结构。当您调用freeaddrinfo()时,该内存不会被释放,最终,CICS区域会耗尽存储空间。我们的开发系统是z/OS1.8,CICS是V3.1,没有针对该版本的修复程序,因此我们需要升级。
C程序中使用malloc()分配的所有内存在使用free()释放时都将被释放。但是,当应用程序/事务完成时,任何未显式释放的资源都不会返回。Out应用程序使用DLLs,这些DLL似乎驻留在内存中。当您再次运行应用程序时,CICS使用的内存总量保持不变。因此,只要代码中没有内存泄漏,CICS的内存使用量就不会增加。
https://stackoverflow.com/questions/36544862
复制相似问题