Locating the name of the failing routine for a non-XPLINK application

If a system dump is taken, follow the save area chain to find out the name of the failing routine and whether IBM® owns it. Following are the procedures for locating the name of the failing routine, which is the primary entry point name.

  1. Find the entry point associated with the current save area. The entry point address (EPA), located in the previous save area at displacement X'10', decimal 16, points to it.
  2. Determine the entry point type, of which there are four:
    Entry point type is… If…
    Language Environment conforming The entry point plus 4 is X'00C3C5C5'.
    Language Environment conforming OPLINK The entry point plus 4 is X'01C3C5C5'. OPLINK linkage conventions are used.
    C/C++ The entry point plus 5 is X'CE'.
    Nonconforming The entry point is none of the above. Nonconforming entry points are for routines that follow the linking convention in which the name is at the beginning of the routine. X'47F0Fxxx' is the instruction to branch around the routine name.

    For routines with Language Environment-conforming and C/C++ entry points, Language Environment provides program prolog areas (PPAs). PPA1 contains the entry point name and the address of the PPA2; PPA2 contains pointers to the timestamp, where release level keyword information is found, and to the PPA1 associated with the primary entry point of the routine.

    • If the entry point type of the failing routine is Language Environment-conforming, go to step 3.
    • If the entry point type is C/C++, go to step 5.
    • If the entry point type is nonconforming, go to step 6.
  3. If the entry point type is Language Environment-conforming, find the entry point name for the Language Environment or COBOL program.
    1. Use an offset of X'C' from the entry point to locate the address of the PPA1.
    2. In the PPA1, locate the offset to the length of the name. If OPLINK, then multiply the offset by 2 to locate the actual offset to the length of the name.
      Note: Start of changeEnterprise COBOL V5.1 and later releases use OPLINK.End of change
    3. Add this offset to the PPA1 address to find the halfword containing the length of the name, followed by the entry point name.

      The entry point name appears in EBCDIC, with the translated version in the right-hand margin of the system dump.

  4. Find the Language Environment or COBOL program name.
    1. Start of changeFind the address of PPA2 at X'04' from the start of PPA1. For Enterprise COBOL V5.1 or later releases, find a signed offset at X'04' from the start of PPA1, then add this offset to the entry point address to obtain the address of PPA2.End of change
    2. Start of changeFind the address of the compilation unit's primary entry point at X'10' in the PPA2. For Enterprise COBOL V5.1 and later releases, find a signed offset at X'10' in the PPA2, then add this offset to the address of PPA2 to obtain the compilation unit's primary entry point.End of change
    3. Find the entry point name associated with the primary entry point as described above. The primary entry point name is the routine name.
    See z/OS Language Environment Vendor Interfaces for details of:
    • the non-XPLINK Language Environment-conforming PPA1 and PPA2.
    • the XPLINK Language Environment-conforming PPA1, and the XPLINK PPA1 optional area fields.
    • the non-XPLINK Language Environment PPA2.
    • the Language Environment PPA2: Compile Unit Block for XPLINK.
    • the PPA2 timestamp and version information.
  5. If the entry point type is C/C++, find the C/C++ routine name.
    1. Use the entry point plus 4 to locate the offset to the entry point name in the PPA1 (see Figure 1 ).
    2. Use this offset to find the length-of-name byte followed by the routine name.

      The routine name appears in EBCDIC, with the translated version in the right-hand margin.

    Figure 1. C PPA1
    PPA1 Trace Table Format
  6. If the entry point type is nonconforming, find the PL/I routine name.
    1. Find the one byte length immediately preceding the entry point. This is the length of the routine name.
    2. Go back the number of bytes specified in the name length. This is the beginning of the routine name.
  7. If the entry point type is nonconforming, find the name of the routine other than PL/I.
    1. Use the entry point plus 4 as the location of the entry point name.
    2. Use the next byte as the length of the name. The name directly follows the length of name byte. The entry point name appears in EBCDIC with the translated version in the right-hand margin.

    Figure 2 shows a nonconforming entry point type. Nonconforming entry points that can appear do not necessarily follow this linking convention. The location of data in these save areas can be unpredictable.

    Figure 2. Nonconforming entry point type with sample dump
      020000  =  47F0F00C  06D3C9E2  E3C9E300  90ECD00C  E0B |.00..LISTIT.....|
      020010  =  18CF41B0  C29850BD  000850DB  000418DB      |....Bq&...&.....|
      020020  =  4510C052  E3E8D7D3  C9D54040  01020034      |....TYPLIN  ....|
      020030  =  C200001E  C5D5E3C5  D940D5E4  D4C2C5D9      |B...ENTER NUMBER|
      020040  =  40D6C640  D9C5C3D6  D9C4E240  D6D940C1      | OF RECORDS OR A|
      020050  =  D3D30ACA  00020058  4510C06C  E6C1C9E3      |LL.........%WAIT|
      020060  =  D9C44040  010202F0  E4000000  0ACA0002      |RD  ...0U.......|