Translate

Mostrar mensagens com a etiqueta RETURN-CODE. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta RETURN-CODE. Mostrar todas as mensagens

domingo, 10 de março de 2019

☕💥 A Jornada do Padawan COBOL – Parte 3 Desvendando o Universo dos CALLs no Mainframe

 

Bellacosa Mainframe apresenta o CALL em Cobol Pàrte III

☕💥 A Jornada do Padawan COBOL – Parte 3

Desvendando o Universo dos CALLs no Mainframe

RETURN-CODE, GOBACK, Dumps, CEEDUMP, IPCS e os Segredos Jedi do Troubleshooting

Ou como descobrir que um simples S0C4 pode transformar uma madrugada tranquila em uma aventura digna de um RPG de nível 99

Por Vagner Bellacosa – Bellacosa Mainframe


O momento em que o Padawan encontra seu primeiro ABEND

Todo desenvolvedor Mainframe possui uma história.

Normalmente começa assim:

Segunda-feira.

02h47.

Janela de produção.

Telefone toca.

Gerente pergunta:

O batch das contas correntes caiu.

Você responde:

Qual erro?

Resposta:

S0C4.

Silêncio.

Você pega café.

Abre SDSF.

Começa a aventura.


O universo do RETURN-CODE

Uma das coisas mais elegantes do COBOL é a comunicação entre programas.

Nem tudo precisa explodir com um ABEND.

Podemos retornar informações.

Exemplo:

Programa Chamador

CALL 'VALIDA'

USING WS-CLIENTE


IF RETURN-CODE NOT = 0

DISPLAY "ERRO"

END-IF

Subprograma

IF CPF-INVALIDO

MOVE 8 TO RETURN-CODE

GOBACK

END-IF

Convenção mais utilizada

RCSignificado
0Sucesso
4Aviso
8Erro
12Erro Grave
16Fatal

Exemplo elegante

Subprograma

EVALUATE TRUE


WHEN CLIENTE-INATIVO

MOVE 4 TO RETURN-CODE


WHEN CPF-INVALIDO

MOVE 8 TO RETURN-CODE


WHEN SALDO-NEGATIVO

MOVE 12 TO RETURN-CODE


WHEN OTHER

MOVE 0 TO RETURN-CODE


END-EVALUATE

Por que isso é importante?

Evita ABEND.

Permite tratamento.

Sistema continua vivo.


GOBACK vs EXIT PROGRAM

Padawan adora copiar.

Mestre entende diferença.


STOP RUN

STOP RUN

Finaliza tudo.

Acabou.

Batch morre.


GOBACK

GOBACK

Retorna.

Educado.

Seguro.


EXIT PROGRAM

Muito usado em subprogramas.

EXIT PROGRAM

Volta ao chamador.


O preferido da IBM

GOBACK

Sempre.


O grande vilão

S0C4

O Darth Vader dos ABENDS.


O que significa?

Violação de armazenamento.


Tentou acessar

memória inválida.


Exemplo

CALL 'ROTINA'

USING WS-NOME

ROTINA

espera

LK-NOME


LK-ID


LK-DATA

Recebe apenas um.

Kaboom.


Como ocorre

CPU acessa

endereço inexistente.


Exemplo

00000000

ou

FFFFFFFF

Crash.


S0C7

Outro inimigo.


Exemplo

Campo contém

ABC

Programa espera

999

Código

ADD 1 TO WS-VALOR

ABEND.


S806

Muito comum.

Programa não encontrado.


Verificar

STEPLIB

JOBLIB

LNKLST

APF


U4038

Erro do LE.

Language Environment.


Normalmente

problemas de parâmetros.

Heap.

Stack.

Storage.


O CEEDUMP

Ferramenta dos Mestres.

Poucos usam.

Deveriam usar.

Muito.


Compilar

TEST

ou

LIST

Executar

gera

CEEDUMP


Possui

Stack

Registers

Storage

Offsets

Variáveis

Call Stack


Exemplo

MAIN


↓

VALIDA


↓

CPFCHK


↓

FORMATA


↓

ABEND

Melhor que adivinhar.


IPCS

Ferramenta lendária.

Poucos dominam.


Permite

abrir dump.

Examinar memória.

Ver registradores.

Offsets.

TCB.

PSW.


O segredo do Offset

Mensagem

IGZ0035S


OFFSET X'01A2'

LISTING

0001A2 MOVE WS-ID

Achou erro.


Capturando problemas

Técnica Bellacosa 1

Log antes.

DISPLAY 'ENTRADA'


DISPLAY WS-ID


DISPLAY WS-NOME

Técnica 2

Log depois.

DISPLAY 'RETORNO'

Técnica 3

Interface versionada

05 LK-VERSAO.


PIC X(02).

Técnica 4

Validar ponteiros

IF PTR = NULL

DISPLAY 'ERRO'

END-IF

Técnica 5

Checksum

Estruturas críticas.


Técnica 6

Tamanho esperado

IF LENGTH OF LK-AREA


NOT = 256

Descobrindo loops

CALL

A

B

C

A

B

C


CPU

100%


Usar

SMF

RMF

Strobe

APA


Detectando corrupção

Antes

MOVE WS-BLOCO TO WS-BKP

Depois

Comparar.

IF WS-BKP


NOT = WS-BLOCO

Monitorando produção

SMF 30

SMF 110

RMF


Dica Bellacosa

Nunca faça:

MOVE 16 TO RETURN-CODE
CONTINUE

E ignore.


Faça

IF RETURN-CODE > 0

DISPLAY MSG


PERFORM LOG


END-IF

Easter Egg Mainframe

Existe em praticamente todos os bancos:

Programa

GENCALL

ou

UTIL0001

Possui:

7000 linhas.

300 CALLs.

120 IFs.

47 GO TO.

3 autores.

Última alteração:

Documentação:

Nenhuma.


Produção:

Executa há vinte anos.


Ninguém mexe.


É conhecido como:

O Boss Final do Mainframe™


Checklist Jedi de Troubleshooting

✅ Verificar RETURN-CODE

✅ Conferir parâmetros

✅ Conferir ordem

✅ Conferir tamanho

✅ Conferir LISTING

✅ Conferir CEEDUMP

✅ Conferir Offset

✅ Conferir STEPLIB

✅ Conferir Binder

✅ Conferir RENT

✅ Conferir Work-Storage

✅ Conferir Local-Storage

✅ Conferir ponteiros

✅ Conferir versão da interface

✅ Conferir quantidade de cafés consumidos


A Filosofia Jedi do CALL – Parte 3

O Padawan iniciante acredita:

"O programa caiu."

O desenvolvedor intermediário pensa:

"Preciso achar a linha."

O Mestre Mainframe sabe:

O programa nunca cai sozinho.

Ele deixa pistas.

Offsets.

PSW.

CEEDUMP.

Registers.

SMF.

IPCS.

RETURN-CODE.

Storage.

Call Stack.

E o verdadeiro Jedi do z/OS aprende que depurar um problema em produção não é apenas corrigir um bug.

É fazer arqueologia digital em sistemas que processam bilhões de transações por dia, compreender contratos invisíveis entre programas escritos ao longo de décadas e transformar um assustador S0C4 das 3 da manhã em apenas mais uma história para contar tomando um café no Bellacosa Mainframe.


Na Parte 4, o Padawan enfrentará o conteúdo avançado: Reentrância, RENT/NORENT, Thread Safety, HEAP, STACK, CICS, LE, AMODE 31/64, otimização extrema de CALLs, microbenchmarks e os segredos utilizados pelos arquitetos de sistemas IBM Z para executar milhões de chamadas por segundo com segurança.


sexta-feira, 9 de março de 2007

O que é RETURN-CODE em COBOL?

 

Bellacosa Mainframe e o return-code no Cobol

O que é RETURN-CODE em COBOL?

O RETURN-CODE é uma variável especial utilizada para informar ao sistema operacional, ao JCL e aos schedulers o resultado da execução de um programa.

Em outras palavras:

é o código de retorno que o programa devolve ao z/OS quando termina.


Para que serve?

O RETURN-CODE informa se o programa:

  • executou com sucesso;

  • terminou com avisos;

  • encontrou erros;

  • deve interromper o fluxo do JOB.


Fluxo simplificado

PROGRAMA COBOL
       ↓
RETURN-CODE
       ↓
STEP JCL
       ↓
JES2
       ↓
Scheduler (IWS, Control-M, OPC)

Exemplo mais simples

MOVE 0 TO RETURN-CODE

Significa:

Execução OK

Valores mais comuns

Return CodeSignificado
0Sucesso
4Aviso
8Erro
12Erro grave
16Erro crítico

Exemplo

IF WS-ARQUIVO-VAZIO
   MOVE 4 TO RETURN-CODE
END-IF

Resultado:

Job terminou com Warning

Exemplo de erro

IF WS-ERRO-LEITURA
   MOVE 8 TO RETURN-CODE
END-IF

Onde o RETURN-CODE fica?

O compilador COBOL fornece automaticamente a variável especial:

RETURN-CODE

Não precisa ser declarada.


Exemplo completo

IDENTIFICATION DIVISION.
PROGRAM-ID. TESTE.

PROCEDURE DIVISION.

    DISPLAY 'PROCESSAMENTO OK'

    MOVE 0 TO RETURN-CODE

    GOBACK.

Como aparece no JCL?

Após o STEP terminar:

COND CODE 0000

ou

CC 0000

Exemplo com erro

MOVE 8 TO RETURN-CODE

No spool:

COND CODE 0008

Uso em Scheduler

Ferramentas como:

  • IBM IWS (Tivoli Workload Scheduler)

  • OPC

  • Control-M

  • CA-7

  • ESP

avaliam o Return Code.


Exemplo

RC = 0000

Próximo JOB é liberado.


RC = 0008

Fluxo interrompido.


Uso com COND no JCL

//STEP2 EXEC PGM=RELATORIO,
// COND=(8,LT)

Significa:

Se RC anterior < 8
execute o STEP

Uso com IF no JCL

Mais moderno.

// IF (STEP1.RC = 0) THEN
//STEP2 EXEC PGM=PROG2
// ENDIF

Exemplo prático

Processamento de clientes.

IF QTDE-CLIENTES = ZERO
   MOVE 4 TO RETURN-CODE
END-IF

Resultado:

Nenhum cliente processado

Mas sem ABEND.


Return Code não é ABEND

Muitos iniciantes confundem.


RETURN-CODE

Programa terminou normalmente.

RC=8

ABEND

Programa terminou anormalmente.

S0C7
S0C4
U4038

Comparação

SituaçãoResultado
MOVE 8 TO RETURN-CODETérmino normal
S0C7ABEND
S0C4ABEND
U0001ABEND usuário

RETURN-CODE em Subprogramas

Pode ser utilizado antes do:

GOBACK

Exemplo

IF ERRO
   MOVE 12 TO RETURN-CODE
END-IF

GOBACK

RETURN-CODE x GOBACK

MOVE 8 TO RETURN-CODE
GOBACK

O sistema recebe:

RC=8

RETURN-CODE x STOP RUN

Também funciona.

MOVE 0 TO RETURN-CODE
STOP RUN

Convenções corporativas

Muitas empresas adotam padrões:

RCSignificado
0OK
4Warning
8Erro funcional
12Erro grave
16Erro fatal

Exemplo bancário

EVALUATE TRUE

   WHEN ARQUIVO-VAZIO
      MOVE 4 TO RETURN-CODE

   WHEN REGISTRO-INVALIDO
      MOVE 8 TO RETURN-CODE

   WHEN ERRO-BANCO-DADOS
      MOVE 12 TO RETURN-CODE

END-EVALUATE

Como visualizar?

No SDSF:

ST

ou

H

Exemplo:

JOB12345 ENDED RC=0000

ou

JOB12345 ENDED RC=0008

Curiosidades

1. RETURN-CODE existe há décadas no COBOL


2. É fundamental para automação batch


3. Schedulers dependem fortemente dele


4. Grandes bancos possuem tabelas corporativas de RCs padronizados


Erros comuns de iniciantes

Esquecer de definir RETURN-CODE


Retornar sempre zero


Confundir RC com ABEND


Não documentar significado dos RCs


Resumo rápido

ComandoFunção
RETURN-CODECódigo de retorno
RC=0Sucesso
RC=4Aviso
RC=8Erro
RC=12Erro grave
RC=16Erro crítico
GOBACKRetorna ao chamador
STOP RUNFinaliza programa

Conclusão

O RETURN-CODE é o mecanismo utilizado pelos programas COBOL para informar ao z/OS, ao JES2, ao JCL e aos schedulers o resultado da execução. Ele é essencial para o controle de fluxos batch, automação corporativa e monitoramento de processos em ambientes Mainframe IBM Z.