如何在一个简单的程序中修复U4038

时间:2015-10-23 14:08:30

标签: cobol mainframe zos

我正在尝试在z / OS大型机系统上执行一个简单的COBOL程序。该程序仅打开和关闭文件。它编译时没有错误,但是当我运行它时,我得到一个U4038异常终止。

这是该程序的代码:

----+-*A-1-B--+----2----+----3----+----4----+----5----+----6----+----7-|--+----8
        IDENTIFICATION DIVISION.
        PROGRAM-ID. LISTKSDS
        AUTHOR. TestingUser

        ENVIRONMENT DIVISION.
        CONFIGURATION SECTION.
        INPUT-OUTPUT SECTION.
        FILE-CONTROL.
           SELECT INFILE ASSIGN TO DATAIN
             ORGANIZATION IS INDEXED
             ACCESS MODE IS SEQUENTIAL
             RECORD KEY EST-KEY
             FILE STATUS IS WS-FILE-STATUS.

        DATA DIVISION.
        FILE SECTION.
        FD INFILE.
        COPY EST01.

        WORKING-STORAGE SECTION.
        01 VARIABLES.
           05 WS-FILE-STATUS    PIC X(2).

        LINKAGE SECTION.

        PROCEDURE DIVISION.
             DISPLAY "STARTING PROGRAM.."
             PERFORM INITIALIZATION
             PERFORM TERMINATION
             GOBACK.

        INITIALIZATION.
             DISPLAY "OPENING FILE.."
             OPEN INPUT INFILE
             IF WS-FILE-STATUS IS NOT EQUAL TO '00'
             THEN
             GO TO ERROR-EXIT
             END-IF.

        TERMINATION.
             CLOSE INFILE.

        ERROR-EXIT.

编译工作:

//TESTUSEC  JOB NERT4587,CLASS=C,MSGCLASS=X,NOTIFY=&SYSUID
//*
//STEP1   EXEC IGYWCL,PARM=(LIB)
//SYSLIB DD DSN=TES.COPIES.TEST,DISP=SHR
//COBOL.SYSIN DD DSN=TES.SOFT.SRC(SRC04),DISP=SHR
//LKED.SYSLMOD DD DISP=SHR,DSN=TES.SOFT.LIB
//LKED.SYSIN   DD *
   ENTRY LISTKSDS
   NAME  LISTKSDS(R)
/*
//*

提交作业:

//TESTUSEC  JOB NERT4587,CLASS=C,MSGCLASS=X,NOTIFY=&SYSUID
//*
//JOBLIB  DD DSN=TES.SOFT.LIB,DISP=SHR
//*
//STEP1   EXEC PGM=LISTKSDS,REGION=2M
//DATAIN  DD DSN=TES.VS.TEST,DISP=SHR
//*

1 个答案:

答案 0 :(得分:3)

U4038 abend是一个用户异常终止,来自语言环境,"运行时"对于大型机程序(它支持多种大型机语言)。

您有关于此的更多信息。如果您查看您的假脱机输出,我希望您能够找到更多信息。

您已在SELECT上为文件指定了FILE STATUS子句,因此U4038不太可能与文件相关。

但是,您可能遇到导致此程序问题的文件问题。

可能是问题所在。如果它不是 问题,则 问题:

         IF WS-FILE-STATUS IS NOT EQUAL TO '00'
         THEN
         GO TO ERROR-EXIT
         END-IF.

我怀疑你在WS-FILE-STATUS中得到非零值。包含此内容的段落为PERFORM,而GO TO将超出PERFORM的范围。当您测试非零文件状态时,DISPLAY您遇到的非零值始终是个好主意。

在PERFORM范围之外使用GO TO特别糟糕。您的程序将从GO TO的目标段落继续,并继续顺序进入下一个代码。

你没有"下一个代码"。所以节目"结束了#34;。这不是一件有效的事情,所以你得到一个异常终止。

虽然我们无法看到副本的内容,但是假定非零文件状态的东西可能位于它之间,文件定义和您在DATAIN DD语句中指定的文件之间

最有可能的是,程序中定义的数据大小与JCL中指定的文件不匹配,或者程序中定义的密钥与JCL中的文件不匹配。

您需要在假脱机输出中找到附加消息。这通常会有很大帮助。如果你无法从中获取它,请粘贴步骤中的整个SYSOUT输出。

您使用的是最少数量的句号/句号,但最好在第12列中将它们放在自己的行上,这样它们就不会附加到任何代码上。然后,您无法复制代码,并在一个关键的错误位置意外地以句号/句号结束。

您还将收到编译器诊断,因为您的ERROR-EXIT不包含代码。始终查看您的消息并相应地更正代码。

还要注意缩进。它对编译器没有任何意义,但你为人类阅读器编写代码格式,所以请注意这一点,因为你永远不知道你什么时候会在一段时间后,或者你的队友在凌晨2点。或者您的导师/导师检查您的工作。

在您的linkedit / bind上,您指定了DISP = SHR。请改为DISP = OLD。如果您设法同时运行两个链接,则可以删除您的库。