编写程序错误程序
您可以编写基于提供的缺省程序 DFHPEP 的程序错误程序。
CICS提供的缺省程序错误程序 (DFHPEP) 包含用于获取程序可寻址性,访问通信区域以及通过 EXEC CICS RETURN 命令将控制权返回给 CICS® 的代码。
DFHPEP 的源以汇编语言和 C 版本提供; 您可以修改其中一个以包含自己的逻辑,也可以使用 CICS支持的任何语言编写自己的程序错误程序。 程序错误程序受到特定限制:
- 程序的名称必须是 DFHPEP。
- 程序不得发出任何使用 MRO 或 ISC 工具的 EXEC CICS 命令,例如分布式事务处理或函数输送。
- 程序不得发出任何访问可恢复资源的命令。
- 程序无法影响是否执行事务转储。
缺省 DFHPEP 模块是哑元模块。 要对其进行定制,您必须自行对源进行编码。 图 1中提供了 DFHPEP 的列表。 在编写程序错误程序之后,对其进行翻译和组装,并使用它来替换提供的哑元程序。 有关组装和链接编辑用户可替换程序所需的作业控制语句的信息,请参阅 组装和链接编辑用户可替换程序。
在通信区域中提供给 DFHPEP 的信息包括:
- 当前异常终止代码,位于 PEP_COM_CURRENT_ABEND_CODE。
- 原始异常终止代码,位于 PEP_COM_ORIGINAL_ABEND_CODE。 如果事务迂到多个异常终止,那么原始异常终止代码和当前异常终止代码不同; 例如,如果失败的程序在处理先前异常终止时异常终止。 在这种情况下,原始异常终止是事务迂到的第一个异常终止。
- 上次 EXEC CICS 命令时的 EIB ,位于 PEP_COM_USERS_EIB。
- 在 PEP_COM_ABPROGRAM 中发生 (当前) 异常终止的程序的名称。 PEP_COM_ABPROGRAM 按如下所示标识程序:
- 如果在远程系统中运行的分布式程序链接 (DPL) 服务器程序中发生异常终止,那么它标识服务器程序。
- 如果异常终止是本地 ASRA , ASRB 或 ASRD 异常终止,那么它将标识发生程序检查或操作系统异常终止的程序。
- 在所有其他情况下,它标识当前程序。
- (当前) 异常终止时的程序状态字 (PSW) ,位于 PEP_COM_PSW 或 PEP_COM_PSW16 (对于 16 字节 PSW)。 PSW 的完整内容仅适用于 ASRA , ASRB 和 ASRD 异常终止代码。 最后四个字节的 PEP_COM_PSW 和最后八个字节的 PEP_COM_PSW16 (PSW 地址) 也适用于 AICA 代码。
- GP 寄存器 (0-15) 在 (当前) 异常终止时,在EP_COM_寄存器处。
- 程序在遭受 (当前) 异常终止时的执行键,位于 PEP_COM_KEY。 PEP_COM_KEY 的值仅对 ASRA 和 ASRB 异常终止代码有效。
- 在 EP_COM_STORAGE_HIT 处,是否由于存储器保护异常而发生 (当前) 异常终止。 EP_COM_STORAGE_HIT 的值仅对 ASRA 异常终止代码有意义,并指示发生故障的程序尝试覆盖哪些受保护的动态存储区 (CDSA , RDSA , ECDSA , ERDSA , ETDSA , GCDSA 或 GUDSA) (如果有)。
- 可能提供了其他寄存器信息。 附加信息可能包括 64 位 GP 寄存器,访问寄存器,浮点寄存器和向量寄存器。 在通信区域中设置指示符以指示哪些寄存器值可用。
- 如果可用,那么 "中断事件地址" 将存储在通信区域中。 如果它不可用,那么 "中断事件地址" 为零。
- 程序状态字中断信息,位于 PEP_COM_INT。
仅当在本地系统中发生异常终止时,有关应用程序尝试覆盖的 PSW ,寄存器,执行密钥和受保护存储器类型的信息才有意义; 如果在远程系统中运行的 DPL 服务器程序中发生异常终止,那么这些字段设置为零。
要禁用事务,请向 PEP_COM_RETURN_CODE 字段分配值 EP_COM_RETURN_DISABLE。 否则,请允许该字段缺省为零,或者将其设置为值 PEP_COM_RETURN_OK。 CICS 不允许禁用 CICS提供的事务; 因此,请勿尝试禁用以字母 C 开头的标识的事务。
图 1 显示缺省程序错误程序的汇编语言源代码。 图 2 到 图 4 显示了通信区域的源代码。
DFHEISTG DSECT ,
*
* Insert your own storage definitions here
*
DFHPCOM TYPE=DSECT
***********************************************************************
* * * * * P R O G R A M E R R O R * * * * *
* * * * * P R O G R A M * * * * *
***********************************************************************
DFHPEP CSECT PROGRAM ERROR PROGRAM CSECT
DFHPEP RMODE ANY
DFHREGS , EQUATE REGISTERS
XR R1,R1
ICM R1,B'0011',EIBCALEN Get Commarea length
BZ RETURNX ...no Commarea; exit
EXEC CICS ADDRESS COMMAREA(R2) ,
USING DFHPEP_COMMAREA,R2
*
* Insert your own code here
*
LA R1,PEP_COM_RETURN_OK
B RETURN
DFHEJECT
*
RETURNER DS 0H Return for error cases
LA R1,PEP_COM_RETURN_DISABLE
RETURN DS 0H
ST R1,PEP_COM_RETURN_CODE
RETURNX DS 0H
EXEC CICS RETURN ,
END DFHPEP
图 2 到 图 4 显示缺省程序错误程序的通信区域的汇编语言源代码。
DFHPEP_COMMAREA DSECT
*
* Standard header section
*
PEP_COM_STANDARD DS 0F
PEP_COM_FUNCTION DS CL1 Always '1'
PEP_COM_COMPONENT DS CL2 Always 'PC'
PEP_COM_RESERVED DS C Reserved
*
* Abend codes and EIB
*
PEP_COM_CURRENT_ABEND_CODE DS CL4 Current abend code
PEP_COM_ORIGINAL_ABEND_CODE DS CL4 Original abend code
PEP_COM_USERS_EIB DS CL(EIBRLDBK-EIBTIME+L'EIBRLDBK)
* EIB at last EXEC CICS command
*
* Debugging information (program, PSW, registers and execution key at
* time of abend, hit storage indicator). If the abend occurred in a
* DPL server program running remotely, only program is meaningful.
*
PEP_COM_DEBUG DS 0F
PEP_COM_ABPROGRAM DS CL8 Program causing abend
PEP_COM_PSW DS CL8 PSW at abend
* (codes ASRA, ASRB, AICA, ASRD)
PEP_COM_REGISTERS DS CL64 GP registers at abend
* (registers 0-15)
PEP_COM_KEY DS X Execution key at abend
* (ASRA and ASRB only)
PEP_COM_USER_KEY EQU 9 User key
PEP_COM_CICS_KEY EQU 8 CICS key
*
PEP_COM_STORAGE_HIT DS X Storage type hit by 0C4
* (ASRA only)
PEP_COM_NO_HIT EQU 0 No hit, or not 0C4
PEP_COM_CDSA_HIT EQU 1 CDSA hit
PEP_COM_ECDSA_HIT EQU 2 ECDSA hit
PEP_COM_ERDSA_HIT EQU 3 ERDSA hit
PEP_COM_RDSA_HIT EQU 4 RDSA hit
PEP_COM_EUDSA_HIT EQU 5 EUDSA hit
PEP_COM_UDSA_HIT EQU 6 UDSA hit
PEP_COM_ETDSA_HIT EQU 7 ETDSA hit
PEP_COM_GCDSA_HIT EQU 8 GCDSA hit
PEP_COM_GUDSA_HIT EQU 9 GUDSA hit
*
PEP_COM_SPACE DS X Subspace/basespace
PEP_COM_NOSPACE EQU 0
PEP_COM_SUBSPACE EQU 10 Abending task was in
* subspace
PEP_COM_BASESPACE EQU 11 Abending task was in
* basespace
PEP_COM_PADDING DS CL2 Reserved
*
* Return code
*
PEP_COM_RETURN_CODE DS F
PEP_COM_RETURN_OK EQU 0
PEP_COM_RETURN_DISABLE EQU 4 Disable transaction
*
* Additional Program status word information
*
PEP_COM_INT DS CL8 PSW interrupt codes
*
* Breaking Event Address
*
PEP_COM_BEAR DS AD Breaking Event Addr
*
*
* Additional register information
*
DS 0D Force alignment
PEP_COM_FLAG1 DS X Flag byte
PEP_COM_GP64_REGS_AVAIL EQU X'80' 64 bit register values
* available in
* PEP_COM_G64_REGISTERS
PEP_COM_ACCESS_REGS_AVAIL EQU X'40' 64 bit register values
* available in
* PEP_COM_ACCESS_REGISTERS
PEP_COM_ORIGINAL_FPR_AVAIL EQU X'20' FPR 0, 2, 4 & 6 values
* available in
* PEP_COM_FP_REGISTERS
PEP_COM_ADDITIONAL_FPR_AVAIL EQU X'10' All FPR available in
* PEP_COM_FP_REGISTERS &
* FPCR in
* PEP_COM_FPC_REGISTER
DS CL7 Reserved
PEP_COM_GP64_REGISTERS DS CL128 64 bit GP registers
PEP_COM_FP_REGISTERS DS 0CL132 FP registers
PEP_COM_FP_REGISTER0 DS FD FP register 0
PEP_COM_FP_REGISTER1 DS FD FP register 1
PEP_COM_FP_REGISTER2 DS FD FP register 2
PEP_COM_FP_REGISTER3 DS FD FP register 3
PEP_COM_FP_REGISTER4 DS FD FP register 4
PEP_COM_FP_REGISTER5 DS FD FP register 5
PEP_COM_FP_REGISTER6 DS FD FP register 6
PEP_COM_FP_REGISTER7 DS FD FP register 7
PEP_COM_FP_REGISTER8 DS FD FP register 8
PEP_COM_FP_REGISTER9 DS FD FP register 9
PEP_COM_FP_REGISTER10 DS FD FP register 10
PEP_COM_FP_REGISTER11 DS FD FP register 11
PEP_COM_FP_REGISTER12 DS FD FP register 12
PEP_COM_FP_REGISTER13 DS FD FP register 13
PEP_COM_FP_REGISTER14 DS FD FP register 14
PEP_COM_FP_REGISTER14 DS FD FP register 15
PEP_COM_FPC_REGISTER DS F FPC register
PEP_COM_ACCESS_REGISTERS DS CL64 Access registers
*
*
* 16 byte PSW at time of abend
*
PEP_COM_PSW16 DS CL16 16 byte PSW
*
* Vector Register Information
*
PEP_COM_VR_REGISTERS DS 0CL512 VR registers
PEP_COM_VR_REGISTER0 DS CL16 VR Register 0
PEP_COM_VR_REGISTER1 DS CL16 VR Register 1
PEP_COM_VR_REGISTER2 DS CL16 VR Register 2
PEP_COM_VR_REGISTER3 DS CL16 VR Register 3
PEP_COM_VR_REGISTER4 DS CL16 VR Register 4
PEP_COM_VR_REGISTER5 DS CL16 VR Register 5
PEP_COM_VR_REGISTER6 DS CL16 VR Register 6
PEP_COM_VR_REGISTER7 DS CL16 VR Register 7
PEP_COM_VR_REGISTER8 DS CL16 VR Register 8
PEP_COM_VR_REGISTER9 DS CL16 VR Register 9
PEP_COM_VR_REGISTER10 DS CL16 VR Register 10
PEP_COM_VR_REGISTER11 DS CL16 VR Register 11
PEP_COM_VR_REGISTER12 DS CL16 VR Register 12
PEP_COM_VR_REGISTER13 DS CL16 VR Register 13
PEP_COM_VR_REGISTER14 DS CL16 VR Register 14
PEP_COM_VR_REGISTER15 DS CL16 VR Register 15
PEP_COM_VR_REGISTER16 DS CL16 VR Register 16
PEP_COM_VR_REGISTER17 DS CL16 VR Register 17
PEP_COM_VR_REGISTER18 DS CL16 VR Register 18
PEP_COM_VR_REGISTER19 DS CL16 VR Register 19
PEP_COM_VR_REGISTER20 DS CL16 VR Register 20
PEP_COM_VR_REGISTER21 DS CL16 VR Register 21
PEP_COM_VR_REGISTER22 DS CL16 VR Register 22
PEP_COM_VR_REGISTER23 DS CL16 VR Register 23
PEP_COM_VR_REGISTER24 DS CL16 VR Register 24
PEP_COM_VR_REGISTER25 DS CL16 VR Register 25
PEP_COM_VR_REGISTER26 DS CL16 VR Register 26
PEP_COM_VR_REGISTER27 DS CL16 VR Register 27
PEP_COM_VR_REGISTER28 DS CL16 VR Register 28
PEP_COM_VR_REGISTER29 DS CL16 VR Register 29
PEP_COM_VR_REGISTER30 DS CL16 VR Register 30
PEP_COM_VR_REGISTER31 DS CL16 VR Register 31
* length of DFHPEP_COMMAREA
*
PEP_COM_LEN EQU *-PEP_COM_STANDARD