COBOL中识别程序调用子模块
Posted
技术标签:
【中文标题】COBOL中识别程序调用子模块【英文标题】:Identifying program calling sub-module in COBOL 【发布时间】:2020-03-30 13:22:18 【问题描述】:假设我有一个 COBOL 模块 X,它被另一个程序 Y 调用。
如何在 X 中识别 Y 的名称?
我当然可以在链接部分将它传递给每个子模块,但我宁愿依靠一种更程序化的方式来处理这个问题,而不是开发人员正确编码一些文字。
但是有什么已知的方法可以有效地做到这一点吗?或许是一些晦涩难懂的 LE 功能或特定的控制块需要阅读?
所有程序都在带有 Enterprise COBOL 的 z/OS 上批量运行。
【问题讨论】:
【参考方案1】:您可以返回 DSA(数据保存区,对于 AMODE31 非 XPLINK,指向 DSA 的指针在寄存器 13 中。)到前一帧(也就是您的调用者),然后如果该帧是用高级语言编写的(例如COBOL,C),那么你需要找到EP(入口点)的开始,然后你可以导航到PPA1控制块。 EP 的名称将接近 PPA1 的末尾。 (您将需要使用 PPA1 中的偏移信息以编程方式获取它。)
如果您的代码需要与各种不同的 LE 程序一起使用,您将需要编写足够多的代码来处理它们而不会出现异常情况。 (例如,您的 COBOL 程序 Y 可能由非 LE 汇编程序、LE 汇编程序或其他 COBOL 程序调用。)如果您将检查限制为使用 LE 高级语言编写的调用者,您可以使您的工作更轻松。
【讨论】:
一个简单的技巧是调用 CEETBCK 以生成所有 DSA 帧的堆栈跟踪“在你之上”......你可以选择调用者而无需逐步完成所有(特定于发行版)数据区域。以上是关于COBOL中识别程序调用子模块的主要内容,如果未能解决你的问题,请参考以下文章
大型机 CEE3DD 异常终止 - CEE3501S - 在 COBOL 动态调用中找不到模块