Translate

terça-feira, 30 de março de 2021

O Guia Definitivo para um Programador Padawan Entender o Que Realmente Acontece Quando um Programa "Morre" no IBM Z

 

Bellacosa Mainframe apresenta abends sem misterios

☕ Um Café no Bellacosa Mainframe

ABEND sem Mistérios

O Guia Definitivo para um Programador Padawan Entender o Que Realmente Acontece Quando um Programa "Morre" no IBM Z

"O primeiro ABEND assusta. O centésimo ensina. O milésimo transforma um programador comum em alguém que consegue conversar com o sistema operacional."


Introdução

Existe um momento na vida de praticamente todo programador COBOL em que ele termina seu código, compila sem erros, executa o JOB e...

***** ABEND *****

Silêncio.

O coração acelera.

A primeira reação costuma ser:

"Meu programa está errado."

Na maioria das vezes, essa conclusão está incompleta.

No mundo Mainframe, um ABEND (Abnormal End) não significa apenas que o programa possui um erro. Ele significa que alguma parte do ecossistema que envolve aquela execução encontrou uma condição considerada fatal.

E esse ecossistema é enorme.

Um programa COBOL nunca trabalha sozinho.

Ele depende de:

  • JCL

  • JES2

  • z/OS

  • Catálogo

  • Arquivos

  • CICS

  • Db2

  • VSAM

  • SDSF

  • Memória

  • Storage

  • Segurança (RACF)

  • Compilador

  • Link-Edit

  • Bibliotecas (STEPLIB)

Quando qualquer uma dessas peças falha, o programa pode terminar com um ABEND.

Entender isso é a primeira evolução de um Programador Padawan.


Afinal, o que significa ABEND?

ABEND é abreviação de:

ABnormal END

Ou seja:

O sistema encerrou aquela execução porque ela não podia continuar de maneira segura.

É importante observar que:

Nem todo erro produz um ABEND.

Um programa pode terminar normalmente retornando RC=08.

Outro pode gerar apenas mensagens.

Já um ABEND significa:

"A execução foi interrompida imediatamente."


Quem executa um programa COBOL?

Muitos iniciantes imaginam algo assim:

COBOL
 ↓
Executa

Na realidade, acontece algo muito maior.

JCL

↓

JES2

↓

Initiator

↓

Load Module

↓

Language Environment

↓

Programa COBOL

↓

Arquivos

↓

Db2

↓

VSAM

↓

CICS

↓

z/OS

O programa é apenas um pequeno participante.


O papel do JCL

O JCL funciona como um plano de execução.

Ele informa:

  • qual programa executar;

  • quais arquivos abrir;

  • quais bibliotecas usar;

  • memória necessária;

  • parâmetros;

  • classes;

  • datasets temporários.

Se o COBOL é o cozinheiro...

O JCL é a receita inteira.


O papel do JES2

O JES2 (Job Entry Subsystem 2) é o grande organizador do processamento batch.

Ele:

  • recebe JOBs;

  • coloca na fila;

  • controla prioridades;

  • envia para execução;

  • coleta SYSOUT;

  • registra mensagens;

  • devolve resultados.

Pense no JES2 como um enorme aeroporto.

Os JOBs são aviões.

O JES2 decide:

  • quem decola;

  • quando decola;

  • em qual pista;

  • para onde vai.


O papel do SDSF

Depois da execução, normalmente usamos o SDSF.

Ele não executa nada.

Ele apenas permite observar.

No SDSF encontramos:

  • JESMSGLG

  • JESJCL

  • JESYSMSG

  • SYSOUT

  • RC

  • ABEND

É o equivalente ao painel de monitoramento.


Como um ABEND nasce?

Imagine:

JCL

↓

Programa COBOL

↓

OPEN INPUT CLIENTES

↓

Arquivo inexistente

↓

IEC141I

↓

S013

Ou então:

MOVE "ABC"
TO WS-NUMERO PIC 9(5)

↓

S0C7

Cada tipo de erro produz um código diferente.

Esse código é o ABEND.


ABENDs do Sistema (Sxxxx)

Quando começam com:

S

Significa:

System Abend

O próprio z/OS detectou o problema.

Exemplos:

S0C4

S0C7

S013

SB37

ABENDs do Usuário (Uxxxx)

Quando aparecem:

U4038

U0999

Foram gerados pela aplicação.

Ou pelo Language Environment.


ABENDs do CICS

No CICS aparecem códigos de quatro letras:

ASRA

AICA

AEI9

São específicos do ambiente transacional.


Os ABENDs mais importantes


S0C1

Operation Exception

O processador tentou executar uma instrução inválida.

Pode ocorrer por:

  • módulo corrompido;

  • CALL incorreto;

  • programa não compilado corretamente;

  • desvio para área inválida.

É relativamente raro.


S0C4

Protection Exception

Provavelmente o ABEND mais famoso.

O programa tentou acessar memória proibida.

Exemplos:

  • ponteiro inválido;

  • tabela fora do OCCURS;

  • endereço inexistente;

  • parâmetro incorreto na LINKAGE.

Sempre que ouvir "Storage Violation", pense em S0C4.


S0C7

Data Exception

O favorito dos iniciantes.

O programa tentou fazer cálculo com dados inválidos.

Exemplo:

PIC 9(5)

conteúdo:

12A45

Ao executar:

ADD 1

Resultado:

S0C7

A maior causa costuma ser falta de validação de entrada.


S013

Erro de Dataset

Relaciona-se à abertura de arquivos.

Normalmente envolve:

  • DCB incompatível;

  • RECFM;

  • LRECL;

  • BLKSIZE;

  • modo de abertura incorreto;

  • DD errado.

É um ABEND de integração entre JCL e programa.


S222

O JOB foi cancelado manualmente.

Normalmente:

CANCEL JOB

Não significa erro da aplicação.


S322

Tempo de CPU excedido.

O programa entrou em loop.

Ou o TIME do JOB foi ultrapassado.

Sempre investigue:

PERFORM UNTIL

GO TO

READ

EOF

S806

Programa não encontrado.

As causas clássicas:

  • STEPLIB incorreta;

  • LOAD inexistente;

  • biblioteca errada;

  • módulo não linkeditado.

É um dos primeiros erros que um desenvolvedor encontra.


SB37

Sem espaço durante gravação.

O dataset atingiu seu limite.

Muito comum em SORTs.


SD37

Sem espaço por quantidade de extents.

Mesmo existindo espaço físico.

O dataset não consegue crescer.


SE37

Quantidade máxima de extensões atingida.

O administrador normalmente resolve ajustando a alocação.


B37

Erro semelhante aos anteriores.

Também relacionado à falta de espaço.

A diferença está na forma como o sistema detectou a limitação.

Na prática, todo Padawan deve associar:

B37

SB37

SD37

SE37

↓

Problemas de espaço em disco.

U4038

Muito comum em COBOL.

Normalmente produzido pelo Language Environment.

Pode esconder:

  • S0C7;

  • S0C4;

  • SQLCODE fatal;

  • erro interno.

Sempre consulte o CEEDUMP.

Nunca pare na primeira mensagem.


U0999

Erro definido pela própria aplicação.

É comum em grandes bancos.

Exemplo:

IF ERRO

DISPLAY "CLIENTE INVALIDO"

MOVE 999 TO RETURN-CODE

CALL ABEND

É um erro de negócio.


ASRA (CICS)

Equivalente ao S0C4 ou S0C7 dentro do CICS.

Na maioria das vezes há um ABEND de sistema escondido atrás dele.

É necessário verificar o dump do CICS.


AEI9

Tentativa de acessar recurso inexistente.

Pode envolver:

  • programa;

  • mapa BMS;

  • fila;

  • recurso não instalado.


AKCS

Erro relacionado ao ambiente CICS ou à configuração de recursos e segurança. Costuma indicar inconsistências operacionais que exigem análise das mensagens associadas e da definição do recurso.


APCT

Programa não encontrado no CICS.

Equivale ao S806 do ambiente batch.

Verifique:

  • PPT;

  • DFHRPL;

  • módulo.


AICA

Loop infinito.

O CICS cancelou a transação.

É o equivalente do:

S322

Só que dentro do CICS.


ATNI

A transação solicitada não está instalada ou habilitada.

Verifique:

  • PCT;

  • nome da transação;

  • instalação dos recursos.


AEYD

Problemas relacionados ao acesso ou ao estado de recursos do CICS (como filas, arquivos ou outros objetos), normalmente indicando que o recurso esperado não está disponível ou não pode ser utilizado da forma solicitada. A mensagem detalhada do CICS complementa o diagnóstico.


Como investigar um ABEND?

Uma sequência bastante utilizada por profissionais experientes é:

1
Qual é o ABEND?

↓

2
É System?
É User?
É CICS?

↓

3
Verificar JESYSMSG

↓

4
Verificar JESMSGLG

↓

5
Verificar SYSOUT

↓

6
Existe CEEDUMP?

↓

7
Existe SYSMDUMP?

↓

8
Analisar última instrução executada

↓

9
Conferir JCL

↓

10
Reproduzir o problema

Essa disciplina evita "corrigir" o sintoma sem encontrar a causa.


Dicas de ouro para um Padawan

  • Leia a primeira mensagem de erro, não apenas a última. Muitas vezes ela explica a causa antes do ABEND.

  • Aprenda a navegar no SDSF. JESMSGLG, JESYSMSG e SYSOUT contam a história da execução.

  • Conheça os utilitários do compilador e do Language Environment. CEEDUMP, SYSMDUMP e IPCS são aliados valiosos.

  • Não altere código antes de entender o erro. Corrigir por tentativa e erro pode esconder problemas mais sérios.

  • Entenda o contexto. Um S806 aponta para bibliotecas; um S013 para JCL e datasets; um S0C7 para dados; um S0C4 para memória. O código do ABEND já indica a direção da investigação.

  • Mantenha um caderno de ABENDs. Profissionais experientes criam seu próprio catálogo de erros e soluções ao longo da carreira.


Curiosidades

  • Muitos bancos possuem verdadeiras "enciclopédias" internas de ABENDs, acumuladas ao longo de décadas.

  • Alguns ABENDs praticamente desapareceram com compiladores modernos, enquanto outros continuam comuns porque dependem de erros de lógica ou configuração.

  • Um mesmo problema de negócio pode gerar ABENDs diferentes dependendo se a execução ocorre em batch, CICS ou sob o Language Environment.

  • Desenvolvedores experientes frequentemente identificam a causa provável apenas ao ouvir um código como S0C7 ou S806, antes mesmo de abrir o dump.


Conclusão

O maior erro de um iniciante é imaginar que um ABEND representa apenas um defeito no programa COBOL.

Na realidade, um ABEND é uma mensagem do ecossistema IBM Z. Ele informa que alguma camada — aplicação, JCL, compilador, Language Environment, CICS, JES2, arquivos, armazenamento ou o próprio z/OS — encontrou uma condição que impediu a continuidade segura da execução.

Aprender a interpretar esses códigos é um divisor de águas. O programador deixa de ser apenas alguém que escreve COBOL e passa a compreender como o sistema operacional, o ambiente batch e o ambiente transacional trabalham em conjunto.

Como todo Padawan descobre cedo ou tarde: escrever o programa é apenas parte do trabalho. O verdadeiro domínio começa quando se entende por que ele executa, por que falha e como o IBM Z revela exatamente onde procurar a causa.


Sem comentários:

Enviar um comentário