Cobol 系统检测到保护异常

Cobol 系统检测到保护异常,cobol,mainframe,Cobol,Mainframe,我正在尝试使用COBOL的排序功能 IDENTIFICATION DIVISION. PROGRAM-ID. ******. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL.

我正在尝试使用COBOL的排序功能

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
这将匹配编译列表每一页标题中的日期/时间

如果您运行一个程序但没有得到该输出,或者您得到的输出不是预期的输出,那么您知道您的程序不是正在运行的程序

现在来看看你的节目

  • 您无需使用输入/输出过程即可进行排序
  • 您应该始终使用SELECT语句的FILE STATUS子句,并在每次IO操作后始终检查您定义的文件状态字段(每个文件一个)。测试输入文件的文件状态字段将允许您识别文件结尾,而不需要曲折的
    结尾/非结尾
    构造
  • 如果使用排序过程,COBOL将执行IO。如果您不这样做,并且使用编译器选项FASTSRT,您的排序产品将执行IO,这将比COBOL更高效
  • 除非选择或重新格式化记录,否则不需要排序过程
  • 由于您使用的是INTO,它会隐式移动记录,因此不需要单独移动数据
  • COBOL,因为支持1985标准的编译器(我相当肯定您会有)有“范围终结器”。在此之前,唯一的范围终止符是句号/句号。现在,在使用“命令语句”和所有条件语句时,使用显式的、特定的范围终结符。在您的情况下,使用RETU替换为READ/END-READ
    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
        .