Finding where a program check occurred

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

  1. 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.
  2. 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
  3. 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.

  4. 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.