COBOL中的CICS程序堆栈

时间:2015-05-08 09:38:19

标签: cobol zos cics

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

3 个答案:

答案 0 :(得分:1)

你可以这样做,但需要一点装配工。基本上,您需要追加保存区域并在返回地址上执行CSVQUERY,这将为您提供拥有该保存区域的模块的名称。

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

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

示例:

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

对保存区域链上的每个返回地址重复执行此操作,您将了解所有呼叫者。

答案 1 :(得分:0)

没有支持的方法可以做到这一点。有些人尝试追逐保存区域并浏览可执行代码以确定其名称,但我怀疑所有人都会流泪。

一个问题是您无法保证LINK或XCTL的实施方式。在动态调用的情况下,您可以跟随保存区域链,但是您需要弄清楚如何识别模块。不是你可能只能在COBOL中做的事情。

答案 2 :(得分:0)

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

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