Cobol 系统检测到保护异常
我正在尝试使用COBOL的排序功能Cobol 系统检测到保护异常,cobol,mainframe,Cobol,Mainframe,我正在尝试使用COBOL的排序功能 IDENTIFICATION DIVISION. PROGRAM-ID. ******. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL.
IDENTIFICATION DIVISION.
PROGRAM-ID. ******.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT IN-FILE ASSIGN TO IFILE.
SELECT OUT-FILE ASSIGN TO OFILE.
SELECT SORT-FILE ASSIGN TO SORTWK.
DATA DIVISION.
FILE SECTION.
SD SORT-FILE.
01 SORT-REC.
05 S-NAME PIC X(20).
05 S-ADDRESS PIC X(20).
05 S-ID PIC 9(9).
05 S-CREDITS PIC 99.
05 FILLER PIC X(29).
FD IN-FILE.
01 IN-REC.
05 IN-NAME PIC X(20).
05 IN-ADDRESS PIC X(20).
05 IN-ID PIC 9(9).
05 IN-CREDITS PIC 99.
05 FILLER PIC X(29).
FD OUT-FILE.
01 OUT-REC PIC X(80).
WORKING-STORAGE SECTION.
01 WS-WORK-AREA.
05 EOF-SW PIC X VALUE SPACES.
01 WS-DETAIL-LINES.
05 RPT-LINE.
10 OUT-NAME PIC X(20).
10 OUT-ADDRESS PIC X(20).
10 OUT-ID PIC 9(9).
10 OUT-CREDITS PIC 99.
10 FILLER PIC X(29) VALUE SPACES.
PROCEDURE DIVISION.
MAIN-RTN.
SORT SORT-FILE
ON ASCENDING KEY S-ID
INPUT PROCEDURE READ-RELEASE
OUTPUT PROCEDURE RETURN-WRITE.
STOP RUN.
OPEN-FILES-RTN.
OPEN INPUT IN-FILE.
OPEN OUTPUT OUT-FILE.
OPEN-FILES-RTN-EXIT. EXIT.
READ-RELEASE.
PERFORM OPEN-FILES-RTN.
PERFORM READ-INPUT
UNTIL EOF-SW = 'F'.
READ-RELEASE-RTN-EXIT. EXIT.
READ-INPUT.
READ IN-FILE
AT END MOVE 'F' TO EOF-SW.
RELEASE SORT-REC FROM IN-REC.
RETURN-WRITE.
MOVE SPACES TO EOF-SW.
PERFORM WRITE-FL
UNTIL EOF-SW = 'F'.
PERFORM CLOSE-FILES-RTN.
RETURN-WRITE-RTN-EXIT. EXIT.
WRITE-FL.
RETURN SORT-FILE RECORD INTO OUT-REC
AT END MOVE 'F' TO EOF-SW.
WRITE OUT-REC.
WRITE-FL-RTN-EXIT. EXIT.
CLOSE-FILES-RTN.
CLOSE IN-FILE OUT-FILE.
CLOSE-FILES-RTN-EXIT. EXIT.
我能够编译此程序,但在执行时,会出现以下错误:
CEE3204S系统检测到保护异常(系统完成
代码=0C4)。从入口点SU98PGM6处的编译单元SU98PGM6
在地址1F45517A处的编译单元偏移量+0005517A处
我已经搜索了这个错误,但我无法找出是什么原因导致我的程序出现这个问题
在记下这些注释后,我做了一些更改,但仍然会遇到与更改后的代码相同的问题
READ-RELEASE.
PERFORM OPEN-FILES-RTN.
PERFORM READ-INPUT
UNTIL EOF-SW = 'F'.
READ-RELEASE-RTN-EXIT. EXIT.
READ-INPUT.
READ IN-FILE
AT END MOVE 'F' TO EOF-SW
NOT AT END PERFORM PROCESS-INPUT.
PROCESS-INPUT.
MOVE IN-NAME TO S-NAME.
MOVE IN-ADDRESS TO S-ADDRESS.
MOVE IN-ID TO S-ID.
MOVE IN-CREDITS TO S-CREDITS.
RELEASE SORT-REC.
PROCESS-INPUT-RTN-EXIT. EXIT.
RETURN-WRITE.
MOVE SPACES TO EOF-SW.
PERFORM WRITE-FL
UNTIL EOF-SW = 'F'.
PERFORM CLOSE-FILES-RTN.
RETURN-WRITE-RTN-EXIT. EXIT.
WRITE-FL.
RETURN SORT-FILE RECORD INTO OUT-REC
AT END MOVE 'F' TO EOF-SW
NOT AT END PERFORM PROCESS-OUTPUT.
WRITE-FL-RTN-EXIT. EXIT.
PROCESS-OUTPUT.
MOVE S-NAME TO OUT-NAME.
MOVE S-ADDRESS TO OUT-ADDRESS.
MOVE S-ID TO OUT-ID.
MOVE S-CREDITS TO OUT-CREDITS.
WRITE OUT-REC.
PROCESS-OUTPUT-RTN-EXIT. EXIT.
这是我的JCL
//******** JOB 1,'*****',NOTIFY=*******
//JOBLIB DD DSN=*******.*******.*******,DISP=SHR
//STEP0 EXEC PGM=SU98PGM6
//IFILE DD DSN=*******.*******.*******.*******(*******),DISP=SHR
//SORTWK DD DSN=*******.*******.*******.*******,DISP=SHR
//OFILE DD DSN=*******.*******.*******.*******,
// DISP=(NEW,CATLG,DELETE),
// DCB=(BLKSIZE=0,LRECL=80,RECFM=FB),
// SPACE=(CYL,(1,1),RLSE),
// UNIT=SYSDA
/*
//SYSOUT DD的输出在使用COBOL、SORT(DFSORT或SyncSORT)和语言环境时可能会混淆,因为它们默认都使用SYSOUT,并且消息会混合显示 幸运的是,您可以更改默认行为,如DFSORT和Language Environment所示(在LE中有许多方法可以指定该选项,最灵活的是JCL中的
//CEEOPTS DD
):
COBOL本身有一个编译器选项OUTDD。该值默认为SYSOUT,但您可以指定任何OUTDD(xxxx)
好的,在看过您的JCL和您关于程序中的DISPLAY语句如何影响数据的评论之后,我已经完成了部分复制 我使用DFSORT,但我不了解您的确切行为,因此我假设您使用SYNCSORT 从JCL中删除
//SYSOUT DD
后,我可以得到以下消息:
IGZ0026W从未引用排序返回特殊寄存器,但
当前内容指示程序中的排序或合并操作
第46行的STOB87未成功
当我将//SYSOUT添加回JCL时,程序运行成功
当我取出//SYSOUT并在排序之前添加一个显示时,程序工作。这是因为,如果JCL中没有//SYSOUT,则执行的第一个显示将导致动态创建一个显示(输出将显示在假脱机中,就像它是一个单独的作业一样,具有相同的名称和作业编号)
就我而言,DFSORT正在抱怨缺少//SYSOUT。通过显示,在DFSORT启动时,//SYSOUT不会丢失
我必须假设SYNCSORT也面临类似的问题,但是运行时COBOL消息没有生成,并且SYNCSORT本身在下一版本中失败
尽管这似乎是一个简单而常见的问题,因为我们总是复制一段JCL来创建一段新的JCL,//SYSOUT始终存在
我想可以参考《企业COBOL编程指南》第12章,了解如何使用SORT-RETURN来确认排序成功完成
我非常确定,如果在JCL中包含//SYSOUT,无论是否有显示,都将不再获得异常终止
“偏移量”高的原因是,异常终止处理器无法识别分拣产品的入口点,因此会继续向后搜索以找到它可以识别的内容,并找到程序入口点,然后计算不正确的偏移量。调用某些汇编程序时也会发生这种情况
首先,对于S0C4,这是一个保护异常,这意味着您正试图访问不属于您的存储,以便进行所需的访问 您将在程序SU98PGM6中获得S0C4。你在这里发帖时巧妙地删除了你的
PROGRAM-ID
名称,这可能没有什么帮助
SU98PGM6不是您的程序。异常终止(异常终止)位于失败程序中的偏移量X'0005517A'处。这意味着,从程序的“开始”(入口点)开始,偏移量/位移X'0005517A'处的指令就是试图做坏事的指令。该偏移量(十进制为348538)表示一个相当大的程序。你的程序很小
有很多方法可以实现这一点。例如,您可能从其他地方复制了JCL,但未能更改EXEC PGM=
。您可能有一个与前面在STEPLIB
串联中的程序同名的程序。您可能编译了错误的程序。等等
当您得到一个异常终止时,请始终确认您拥有的编译列表是针对被异常终止的程序的。一种简单而有用的方法是:
01 W-WHEN-COMPILED PIC X(8)BX(8).
...
* where it can only be executed once:
MOVE WHEN-COMPILED TO W-WHEN-COMPILED
DISPLAY
"yourname COMPILED ON "
W-WHEN-COMPILED
“yourname”替换为PROGRAM-ID后面的文本
输出如下:
yourname COMPILED ON 11/24/15 10.35.26
这将匹配编译列表每一页标题中的日期/时间
如果您运行一个程序但没有得到该输出,或者您得到的输出不是预期的输出,那么您知道您的程序不是正在运行的程序
现在来看看你的节目
结尾/非结尾
构造IDENTIFICATION DIVISION.
PROGRAM-ID. ******.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT IN-FILE ASSIGN TO IFILE.
SELECT OUT-FILE ASSIGN TO OFILE.
SELECT SORT-FILE ASSIGN TO SORTWK.
DATA DIVISION.
FILE SECTION.
SD SORT-FILE.
01 SORT-REC.
05 S-NAME PIC X(20).
05 S-ADDRESS PIC X(20).
05 S-ID PIC 9(9).
05 S-CREDITS PIC 99.
05 FILLER PIC X(29).
FD IN-FILE.
01 IN-REC.
05 IN-NAME PIC X(20).
05 IN-ADDRESS PIC X(20).
05 IN-ID PIC 9(9).
05 IN-CREDITS PIC 99.
05 FILLER PIC X(29).
FD OUT-FILE.
01 OUT-REC PIC X(80).
WORKING-STORAGE SECTION.
01 WS-WORK-AREA.
05 EOF-SW PIC X VALUE SPACES.
01 WS-DETAIL-LINES.
05 RPT-LINE.
10 OUT-NAME PIC X(20).
10 OUT-ADDRESS PIC X(20).
10 OUT-ID PIC 9(9).
10 OUT-CREDITS PIC 99.
10 FILLER PIC X(29) VALUE SPACES.
PROCEDURE DIVISION.
SORT SORT-FILE
ON ASCENDING KEY S-ID
INPUT PROCEDURE READ-RELEASE
OUTPUT PROCEDURE RETURN-WRITE
GOBACK
.
OPEN-FILES-RTN.
OPEN INPUT IN-FILE
OPEN OUTPUT OUT-FILE
.
READ-RELEASE.
PERFORM OPEN-FILES-RTN
PERFORM READ-INPUT
UNTIL EOF-SW = 'F'
.
READ-INPUT.
READ IN-FILE
AT END MOVE 'F' TO EOF-SW
END-READ
RELEASE SORT-REC FROM IN-REC
.
RETURN-WRITE.
MOVE SPACES TO EOF-SW
PERFORM WRITE-FL
UNTIL EOF-SW = 'F'
PERFORM CLOSE-FILES-RTN
.
WRITE-FL.
RETURN SORT-FILE RECORD INTO OUT-REC
AT END MOVE 'F' TO EOF-SW
END-RETURN
WRITE OUT-REC
.
CLOSE-FILES-RTN.
CLOSE IN-FILE OUT-FILE
.