User abend

U4083: Language Environment save area chain error

A U4083 abend means Language Environment found the chain of save areas between called routines broken when it tried to follow it. It almost always points to a storage overlay or to an assembler routine that didn't follow standard linkage.

Other names for this code

Also written as U4083, abend U4083, user abend 4083, 4083 abend, S000 U4083, LE abend 4083, ABEND=S000 U4083, back chain error 4083.

What it means

This page covers user abend 4083 as issued by z/OS Language Environment (LE), the runtime for COBOL, PL/I and C. Other products can use the same number for their own reasons, so first check that the messages around it come from LE.

Every time one routine calls another, the called routine gets a save area. LE calls it a DSA (dynamic save area). It holds the caller's registers and a back pointer to the caller's save area. Together these back pointers form a chain from the current routine to the first one LE set up for the thread. LE follows the chain when it handles a condition and when it builds a traceback.

A healthy chain ends at the save area LE itself created. If LE meets a back pointer of zero, a pointer to something that isn't a save area, or a chain that doesn't end where it should, it stops with U4083. The reason code says which check failed. A reason code of 3, for example, means the chain ended with a zero back pointer before reaching LE's own first save area.

U4083 often comes second. Something else goes wrong first, such as a program check, and when LE walks the chain to handle it, the chain is damaged. IBM APAR PM13670 describes a case like that, where an S0C4 inside the Db2 precompiler led LE to issue U4083 with reason code 4.

Common causes

  • A storage overlay. A table overrun or a bad pointer wrote over a save area, often the program's own working storage sitting next to it.
  • An assembler routine that doesn't follow standard linkage. It doesn't store the back pointer in its new save area, or it returns without restoring register 13.
  • A non-LE assembler routine calling COBOL, PL/I or C programs, or being called by them, without the setup LE expects.
  • An earlier program check, such as S0C4, that left the chain in a state LE can't follow.
  • Now and then a defect in a product module. Search IBM's support site for U4083 with the module named in the dump.

How to find the problem

  1. Note the reason code from IEF450I or the symptom dump, and look it up under abend 4083 in the LE runtime messages manual for your release.
  2. Read every CEE message before the abend. If there is a CEE32xxS message, the program check it reports is probably the first error, and the place to start.
  3. Look at the CEEDUMP traceback. It usually stops early or shows nonsense at the point where the chain breaks. The last sensible entry tells you which routine owned the damaged save area, or called the one that did.
  4. In a system dump, start at register 13 and follow each save area's back pointer, which sits at offset 4 in a standard save area. Where it turns into zeros or text, you have found the damage.
  5. List the assembler routines in the call path. They are the usual suspects for broken linkage.

How to fix it

  • Fix the overlay. Compile COBOL with SSRANGE in test so a subscript that runs past a table fails at the statement that causes it.
  • Correct the assembler linkage. Each routine must chain its save area to the caller's and restore register 13 before it returns. For assembler that runs under LE, the CEEENTRY and CEETERM macros build the right linkage for you.
  • Fix the first error if U4083 followed another abend.
  • If the failing code belongs to IBM or a vendor, apply the fix the support site names for the reason code.

What it looks like

IEF450I ORDRUN01 STEP030 - ABEND=S000 U4083 REASON=00000003

IBM documentation

IBM Language Environment documentation. Use the documentation for your installed release.

This link opens the relevant IBM reference library or lookup instructions. Match the complete code and your installed product release; it is not a code-specific review.

Report a correction to WND Software.

Questions

Does U4083 mean Language Environment is broken?

Rarely. LE is reporting that the chain it relies on was damaged by something else, usually the program's own code or an assembler routine it calls.

Why is the CEEDUMP traceback incomplete?

LE builds the traceback by following the same save area chain. When the chain is broken, the traceback stops at the break, which is itself a clue to where the damage is.

What is the difference between U4083 and U4088?

U4083 is about the save area chain that links called routines. U4088 is about the stack and heap storage LE manages for the program.