我在Cobol程序中使用CICS,我注意到有时数据会从CICS内存中写入。它会导致数据损坏和我的应用程序停止。我不知道它附加在哪里,所以我创建了一个解析器来分析我的Cobol代码,以查找CICS使用的COMMAREA中可能出现的损坏。现在,我检查了以下声明:
EXEC CICS XCTL
EXEC CICS LINK
EXEC CICS RETURN TRANSID对于每一个,我检查发送长度(在LENGTH参数中声明)是否大于发送的COMMAREA。然后我检查接收程序中的DFHCOMMAREA是否大于发送的COMMAREA (根据这个文档http://publib.boulder.ibm.com/infocenter/cicsts/v3r1/index.jsp?topic=%2Fcom.ibm.cics.ts31.doc%2Fdfhp3%2Fdfhp37t.htm):
接收数据区域不需要与原始通信区域相同的长度;如果只需要访问数据的第一部分,则新的数据区域可以更短。但是,它不能超过正在传递的通信区域的长度。如果是,您的事务可能无意中试图读取已传递区域以外的数据。它还可能覆盖该区域以外的数据,这可能导致CICS abend.。
现在,我想知道应该解析哪些其他东西来检测内存过写?
发布于 2012-01-25 17:58:37
当一个CICS程序开始写满内存时,它不仅会“停止工作”,还可能导致CICS区域崩溃!
如果您确信LENGTH是在LINKs和XCTLs上正确设置的,并且您正在将COMMAREA接收到该大小的链接记录(EIBCALEN),那么您应该没事。
我建议您设置编译器边界检查选项,而不是试图解析COBOL程序。您所遇到的问题很可能与超出工作存储表界限的索引或订阅有关。试图通过静态分析来检测这类编程错误通常不是很有效。
设置边界检查应该检测超出范围的内存引用,向日志发出诊断消息,然后在程序崩溃整个CICS区域之前终止程序。记录的消息应指向发生界外引用的源行。
请查看SSRANGE编译时选项。确保设置了它,并且您的CICS区域使用CHECK(ON)运行了启用LE的程序。
这应该会很快地显示出内存引用。
发布于 2012-02-10 13:14:08
在使用Micro时,可以设置memory_strategy可调性(或CBL_MEM_STRATEGY API),通过允许运行时以各种不同的方式保护内存,从而帮助您分析错误发生的位置。
内存也可以通过"CBL_MEM_VALIDATE“调用进行验证。
另一件事是使用追踪支持..。查找CTF (综合追踪设施)。这将使您了解错误发生时代码的位置。
一些对你有帮助的参考资料;
http://kb.microfocus.com/display/4/kb/article.aspx?aid=31645
http://documentation.microfocus.com/help/index.jsp?topic=%2Fcom.microfocus.eclipse.infocenter.studee60win.sp02ws01%2FHRRTRHRTCF0O.html
http://documentation.microfocus.com/help/index.jsp?topic=%2Fcom.microfocus.eclipse.infocenter.studee60ux.sp02ws01%2FGUID-762085AC-8396-4D71-9CC1-6231551D3AEE.html
https://stackoverflow.com/questions/9005110
复制相似问题