| 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