是否有方法识别调用堆栈中的程序名?也就是说,我有一个PGM X连接到一个PGM B,这个链接到一个PGM C,然后,在C中,我想知道是哪个程序发起了调用(PGM X)?
发布于 2018-11-28 15:00:33
如果您在CICS中,可以使用程序选项执行EXEC CICS分配并获取当前程序的名称,以及与INVOKINGPROG链接到该程序的程序。这将给你程序C和程序B在这种情况下。
要获得最初的最高级别的课程是比较困难的。您可以查询当前事务(EIBTRNID)来获取运行的程序,但是如果您已经被路由到某个地方,那么就不是program,而是DFHMIRS。
发布于 2015-05-08 19:49:38
你可以这样做,但这需要一个小汇编程序。本质上,您需要追踪保存区域并在返回地址上执行CSVQUERY,这将给出拥有该保存区域的模块的名称。
有一些奇怪之处,您需要注意Cobol运行时模块(以IGZ为前缀)和/或语言环境模块(以CEE为前缀)。当您执行Cobol调用时,它会调用一个运行时模块,然后调用您调用的程序。
此外,这不会识别执行E.C.链接或E.C.XCTL的程序,只有使用OS保存区域约定的Cobol调用。
示例:
CSVQUERY SEARCH=JPALPA,INADDR=<R14_from_savearea>,OUTEPNM=<module_name_output>,MF=(E,PLIST)
对保存区域链上的每个返回地址重复这样做,您将知道所有调用者。
发布于 2015-05-08 11:29:27
没有得到支持的方法来做到这一点。有些人试图追逐保存区域并遍历可执行代码来确定其名称,但我怀疑所有这些都以眼泪结束。
一个问题是,您无法保证链接或XCTL是如何实现的。在动态调用的情况下,您可能能够跟踪保存区域链,但是您需要弄清楚如何识别模块。你不太可能在COBOL中做任何事情。
https://stackoverflow.com/questions/30120578
复制相似问题