When a transaction abends with code ASRA or ASRD, the first
thing you need to do is find out where the program check occurred. CICS® will
have attempted to establish this for you.
About this task
A record of the program in error and the offset of the
program check within the program load module are contained in the
following places:
- Message DFHAP0001 or DFHSR0001, which will have preceded the abend
- The transaction abend control block (TACB) which will have been
created to describe the abend
- Exception trace point ID AP 0781 for an ASRA abend or AP 0783
for an ASRD abend.
See
Interpreting transaction dumps.
Procedure
- Find the offset of the program check within the program
load module.
The offset indicates the point in the program
at which the program check occurred. Note that the offset is derived
from the PSW next sequential instruction address and so may indicate
the instruction after the one that failed.
- When the offset is X'FFFFFFFF', CICS was unable
to establish the location of the program check. Use the PSW to obtain
the next sequential instruction address.
The PSW can
be found in the following places:
- The TACB for the abend
- At the head of the formatted transaction dump
- Within the kernel error data block traced by exception trace point
IDs AP 0781 or AP 0783
- Note down the start and end addresses of the different
program areas in the transaction dump.
Is the next sequential
instruction address from the PSW in any of the programs? If so, then
that is the program in which the interrupt occurred. Use the procedure
described in
Locating the last command or statement to identify
the last command executed.
If the address is
outside all
of the programs, one of two things is likely to have happened.
- The
program in which the program check occurred was running on your behalf
(for example, VSAM or DL/I), but not under CICS control. This is usually
caused by incorrect parameters being passed to the program, or parameters
being passed in the wrong sequence. These are usually caught and flagged
with an appropriate return code, but certain combinations can cause
problems.
- Your program might have taken a
wild
branch into some other
piece of storage. If the address from the PSW ends in an odd number,
this is probably the case, as valid instructions are always on an
even address. The address could be within the CICS address space,
or anywhere else in virtual storage. Often, a wild branch is taken
to address zero, because the register that should contain the branch
address is set to zero. The PSW usually contains address X'00000004' after
such a branch has occurred.
- Check the register contents to see whether any of them
contains the next sequential instruction address from the PSW, or
something close to it.
This might help you find out how
you got to the wrong address.
If the PSW does
point to an instruction in one of your programs, the next thing to
consider is the type of program check that occurred. Otherwise, turn
directly to Analyzing the problem further.