COBOL 中的 CICS 程序堆栈

CICS Program Stack in COBOL

有没有办法在调用堆栈中识别程序名称? 即,我有一个链接到 PGM B 的 PGM X,这个链接到 PGM C,然后,在 C 中,我想知道哪个程序发起调用 (PGM X)?

没有支持的方法来做到这一点。有些人尝试追逐保存区域并遍历可执行代码以确定其名称,但我怀疑一切都以泪水告终。

一个问题是您无法保证 LINK 或 XCTL 是如何实现的。在动态调用的情况下,您可能能够遵循保存区域链,但是您需要弄清楚如何识别模块。这不是您仅使用 COBOL 就可能做的事情。

你可以做到这一点,但这需要一些汇编程序。本质上,您需要追踪保存区域并在 return 地址上执行 CSVQUERY,这将为您提供拥有该保存区域的模块的名称。

有一些怪癖,您需要注意 Cobol 运行时模块(前缀为 IGZ)and/or 语言环境模块(前缀为 CEE)。当您执行 Cobol 调用时,它会调用运行时模块,然后调用您调用的程序。

此外,这不会识别执行 E.C.LINK 或 E.C.XCTL 的程序,只会识别使用 OS 保存区域约定的 Cobol 调用调用。

示例:

CSVQUERY SEARCH=JPALPA,INADDR=<R14_from_savearea>,OUTEPNM=<module_name_output>,MF=(E,PLIST)

对保存区链上的每个 return 地址重复执行此操作,您就会知道所有调用者。

如果您在 CICS 中,您可以执行 EXEC CICS ASSIGN 并使用 PROGRAM 选项获取当前程序的名称,以及使用 INVOKINGPROG 链接到它的程序。在这种情况下,这将为您提供程序 C 和程序 B。

要获得原版最高级别的程序难度更大。您可以查询当前事务 (EIBTRNID) 以获取正在运行的程序,但如果您已被路由到某个地方,则不会是程序 X,而是 DFHMIRS。