Translate

Mostrar mensagens com a etiqueta S0C1. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta S0C1. Mostrar todas as mensagens

quarta-feira, 13 de dezembro de 2023

Solucionando ABENDS em COBOL

 

Bellacosa Mainframe solucionando abends em cobol

Bellacosa Mainframe e o caçador de abends

Não entre em Pânico.

Supere seus desafios. A solução de ABENDS em mainframe pode ser desafiadora, intrigante, caótica e gratificante ao mesmo tempo, tudo junto e bem misturado. Por isso mantenha uma atitude positiva e uma mentalidade construtiva e esteja pronto para enfrentar qualquer problema que surgir em seu caminho.

Seja paciente e persistente e não desista facilmente. Seja criativo e flexível e não dependa de uma solução ou método, às vezes receitas de bolo pioram o problema. Canalize a colaboração e a cooperação e tente não trabalhar isoladamente.

Ao solucionar problemas, documente e compartilhe o conhecimento com os colegas, lembre-se sempre da máxima do velho deitado, digo velho ditado: uma mão lava a outra e aproveite a jornada do mainframe, participe de um projeto que há 70 anos vem tirando noite de sonos de homens e mulheres nos mais diversos Centros de Processamento de Dados do Mundo.

No pior cenário consulte o manual da linguagem, instalação e procure o Mestre dos Magos, sempre haverá um, mais próximo do que imagine.

ABEND

Relembrando, ABEND é uma situação anômala onde um programa mainframe (COBOL, PLI, Natural, REXX, Easytreve etc) tem um término anormal. Ou seja, termina com erro. A origem da palavra ABEND, que no Brasil virou sinônimo de erro e, ao mesmo tempo, verbo, surgiu da junção de duas palavras inglesas: ABNORMAL (anormal) END.

Muito em uso nos CPDS, agora chega de delongas e vamos ao nosso pequeno help na solução de alguns abends comuns em COBOL Mainframe, que poderão ser visualizados no SDSF, através do SPOOL do JOB, que indicara qual o step do JCL, o programa envolvido e o código do ABEND.

S0C1

Quais são as possíveis causas dos ABEND: S0C1?

O S0C1 é um erro associado a ambiente de I/O, muito normalmente associado a arquivos QSAM/VSAM e suas declarações no programa e JCL, e em algumas raras situações a chamadas CALL em subprogramas. A solução é relativamente simples e a correção é rápida, basta identificar o statemant do erro e verificar o tipo de Bug, conforme tabela abaixo:

1. Nome DD ausente ou escrito incorretamente.

2. Ler/gravar em DataSet não aberto.

3. Leia a saída aberta do DataSet.

4. Gravar na entrada aberta do DataSet.

5. Subprograma chamado não encontrado

S0C4

Quais são as possíveis causas dos ABEND: S0C4?

O SOC4 é um erro associado ao ambiente de I/O, Arrays e Tabelas internas, uso de variáveis computacional. Abaixo temos algumas causas comuns, muitas vezes é necessário o uso de DISPLAY para encontrar o erro com mais segurança, alguns comandos COBOL possuem captura de erro, utilize-os para antecipar e prever anomalias.

1. Instrução Select ausente (durante a compilação), verificar as declarações no Environment Division / Data Division, pode estarem com erro de grafia nome, verifique também a clausula D DD no JCL.

2. Em um array ou Tabela interna o Subscrito/índice está  incorreto.

3. Variável computacional com valores incorretos, uma Exceção de proteção.

4. Falta de inicialização ou variável incorreta, ou seja, parâmetros ausentes na chamada CALL de subprograma.

5. Ler/gravar registros de dados em arquivo não aberto.

6. Gravar registros de dados de/para em arquivo não aberto.

S0C5

Quais são as possíveis causas dos ABEND: S0C5?

O SOC5 é um erro associado ao ambiente de I/O, Arrays e Tabelas internas. Abaixo temos algumas causas comuns, muitas vezes é necessário o uso de DISPLAY para encontrar o erro com mais segurança.

1. Subscrito/índice incorreto em Tabela interna ou Array,

2. Tentativa de Fechar um DataSet não aberto durante o processamento.

3. Problemas no PERFORM, saída conturbada ou erro de logica.

4. Tentativa de acesso à área de E/S (FD) antes do comando READ.

SOC7

Quais são as possíveis causas dos ABEND: S0C7?

Este abend pode ser ocasionado por variáveis numéricas, problemas de cálculos e confusão entre formatos alfanuméricos, alfabéticos e numéricos. Lembrando que toda variável de trabalho deve ser inicializada para evitar surpresas no decorrer do processamento, em algumas situações o mal uso do Índice na Tabela/Array resultará num S0C7

1. Operação numérica em dados não numéricos.

2. Variáveis não inicializadas ou com valores nulos.

3. Estouro de índice no uso de Tabela / Array.

SOCB

Quais são as possíveis causas dos ABEND: S0CB?

O abend S0CB normalmente esta associado com divisão, tanto no DIVIDY como no COMPUTE e informa que o divisor está com o valor zerado ou nulo.

1. Divisão por zero.

DICAS & SOLUÇÕES

Como solucionar um Abend SOC1 ?

Um Abend S0C1 ocorrerá se a CPU tentar executar um código binário que não seja uma instrução de máquina válida, por exemplo. Se você tentar executar dados.

Como solucionar um Abend SOC4 ?


Um S0C4 é uma violação de proteção de memória. Isso ocorre se um programa tentar acessar o armazenamento além das áreas atribuídas a ele. A famosa invasão de área, verifique suas tabelas e array, muitas vezes o culpado esta bem visível.

Como solucionar um Abend SOC7 ?

Em linhas bem gerais, não me xingue, basicamente necessitas corrigir os dados incorretos.

Muitas vezes o motivo do SOC7 é um item numérico não inicializado, lembre-se de usar o VALUE na declaração da variável, ou INITIALIZE no decorrer da execução. Examine essa possibilidade primeiro.

Muitas instalações fornecem um dump para ABENDs em tempo de execução (ele também pode ser gerado chamando algumas sub-rotinas ou serviços do sistema operacional através da linguagem assembly). Esses dumps fornecem o deslocamento da última instrução em que ocorreu o ABEND. Examine a compilação e produza a listagem XREF para obter o comando e o número da linha do código-fonte (Statement) neste deslocamento.

Então poderás olhar o código-fonte para caçar o bug, debugar para os íntimos. Lembrando que para capturar os dumps de tempo de execução, terás que definir alguns conjuntos de dados (SYSABOUT etc) no JCL.

Se nada disso for útil, use julgamento e DISPLAY para localizar a origem do erro, melhor solução sempre, porém lotaras o SPOOL e o analista de produção não gostará muito.

Algumas instalações podem ter ferramentas de depuração de programas em lote. Use-as se possível recomendo: o OMEGAMON e o APA.

DISPLAY

Utilize o comando DISPLAY para realizar uma trilha de DEBUG, assim pode seguir passo-a-passo por onde o ponteiro da execução passou, saberá até o momento anterior ao ABEND.

Utilize para ver o valor do antes e depois da variável após um cálculo, uma chamada CALL e etc.

Handling erros - Tratamento de erros

Deixe o COBOL trabalhar para ti, existem algumas soluções BUG TRAP, use código em seus programas que antecipe possíveis problemas de sistema ou de tempo de execução. Se você não incluir esse código, os dados ou arquivos de saída poderão ser corrompidos e o usuário poderá nem perceber que há um problema.

O código de tratamento de erros pode realizar ações como lidar com a situação, emitir uma mensagem ou interromper o programa. Você pode, por exemplo, criar rotinas de detecção de erros para erros de entrada de dados ou para erros conforme sua instalação os define.

Lembre-se sempre de prevenir, pensar, preparar-se e codificar uma mensagem de aviso é uma boa ideia, os famosos warnings de execução.

1.       ON OVERFLOW em STRING e UNSTRING operações.

2.       ON SIZE ERROR em operações aritméticas.

3.       No tratamento de arquivos de Input e Output.

4.       ON EXCEPTION ou ON OVERFLOW em chamadas CALL.

5.       Criar rotinas para validar e tratar possíveis exceções.

domingo, 14 de abril de 2013

☕🔥 ABEND S0C1 — O “SALTO PARA O VAZIO” DO MAINFRAME

 

Brllacosa Mainframe abend soc1

☕🔥 ABEND S0C1 — O “SALTO PARA O VAZIO” DO MAINFRAME

Quando a CPU IBM Z Tenta Executar…

“ALGO QUE NÃO É UM PROGRAMA.”

Se existe um ABEND que faz o programador COBOL olhar o dump como se fosse hieróglifo alienígena…

é o lendário:

🚨 S0C1

E normalmente ele aparece assim:

IEC999I SYSTEM COMPLETION CODE=0C1

ou:

ABEND=S0C1 U0000 REASON=00000001

ou ainda:

OPERATION EXCEPTION

E aí o Junior Padawan pensa:

“Meu COBOL está quebrado?”
“O compilador enlouqueceu?”
“O load module morreu?”
“A CPU tentou executar magia negra?”

☕ Calma.

Porque o S0C1 é um dos ABENDs MAIS PROFUNDOS do universo z/OS.


🔥 O QUE É O S0C1?

O S0C1 é um:

🚨 OPERATION EXCEPTION

Traduzindo:

A CPU tentou executar uma instrução inválida.

Ou seja:

O processador IBM Z olhou para um byte da memória e disse:

❌ “ISSO NÃO É UMA INSTRUÇÃO MACHINE CODE VÁLIDA.”


☕ A FILOSOFIA DO S0C1

O S0C1 é assustador porque normalmente significa:

o fluxo do programa saiu da realidade esperada.

Algo desviou execução para:

  • lixo

  • dados

  • memória corrompida

  • endereço inválido

  • programa errado

  • módulo quebrado


🔥 O QUE REALMENTE ACONTECE

Imagine:

CPU IBM Z

Executando:

LOAD
ADD
MVC
BRANCH

Tudo normal.

Mas de repente…

o Program Counter aponta para:

FF FF FF FF

ou:

40404040

A CPU tenta interpretar aquilo como instrução.

Resultado:

💥 S0C1


☕ ANALOGIA BELLACOSA MAINFRAME

Imagine um piloto automático de avião.

Ele espera comandos válidos:

SUBIR
DESCER
CURVA

Mas recebe:

ABACAXI CÓSMICO

O sistema entra em colapso.

Isso é o S0C1.


🔥 O MAIOR SEGREDO

S0C1 raramente é “o problema”.

Ele normalmente é:

consequência de corrupção anterior.


☕ AS CAUSAS MAIS COMUNS


🚨 CALL para programa inexistente

Clássico absoluto.

CALL 'PGMXYZ'

Mas o módulo:

não existe

ou está errado.


🚨 Link-edit incorreto

Load module quebrado.


🚨 Branch para storage inválido

O programa desviou para memória errada.


🚨 Overlay de memória

Programa sobrescreveu área crítica.


🚨 Parameter list inválida

Muito comum em LINKAGE SECTION.


🚨 Executar dados como código

O horror máximo.


☕ O CASO MAIS FAMOSO

COBOL CHAMANDO MÓDULO ERRADO

Exemplo:

CALL WS-NOME-PGM

Mas:

WS-NOME-PGM = '     '

ou:

WS-NOME-PGM = '12345'

Agora o sistema tenta carregar lixo.

Resultado:

☠️ S0C1


🔥 O “CALL DINÂMICO MALDITO”

Veteranos têm pesadelos com isso.


☕ CALL ESTÁTICO

Seguro:

CALL 'CALCPGM'

☕ CALL DINÂMICO

Perigoso:

CALL WS-PGM

Porque:

  • pode vir espaço

  • pode vir lixo

  • pode vir nome inválido

  • pode vir lower-case

  • pode vir módulo inexistente


🔥 O S0C1 E O LOAD MODULE

Outro clássico.

Programa compilou.

Mas:

  • link-edit errado

  • módulo corrompido

  • versão incompatível

  • biblioteca incorreta

Então o entry point fica inválido.


☕ O S0C1 E O CICS

No CICS ele normalmente vira:

🚨 ASRA + S0C1

Porque o CICS encapsula o erro.


🔥 O VERDADEIRO TERROR: OVERLAY

Aqui começa o lado sombrio do mainframe.


☕ O QUE É OVERLAY?

Programa sobrescreve memória que não deveria.

Exemplo:

MOVE WS-TEXTO(1:500)
  TO WS-CAMPO(1:10)

ou:

SUBSCRIPT fora da tabela

Agora bytes críticos são destruídos.

Mais tarde…

a CPU tenta executar aquela região.

Resultado:

☠️ S0C1


🔥 O S0C1 FANTASMA

O mais assustador.

Erro acontece LONGE da causa real.

Exemplo:

Linha 100 corrompe memória

Mas o programa explode:

na linha 9000

☕ COMO INVESTIGAR O S0C1 PASSO A PASSO


✅ PASSO 1 — IDENTIFIQUE O PSW

O dump mostra:

PSW AT TIME OF ERROR

Esse é o GPS da tragédia.


✅ PASSO 2 — VEJA O ENDEREÇO

Exemplo:

INSTRUCTION ADDRESS = 00F13A92

✅ PASSO 3 — OLHE O OPCODE

O dump mostra algo como:

0000 0000
FFFFFFFF
40404040

Veterano já suspeita:

“isso não é código executável.”


🔥 O HEXADECIMAL MAIS ASSUSTADOR

40404040

No EBCDIC:

espaços

Ou seja:

A CPU tentou executar espaços como instrução.

Isso é clássico S0C1.


☕ COMO LER O DUMP


☕ PSW

Mostra:

  • endereço

  • modo da CPU

  • interrupção


☕ REGISTERS

Especialmente:

R14
R15

☕ R15

Muitas vezes aponta:

  • programa atual

  • entry point


☕ OFFSET

Exemplo:

OFFSET X'01FA'

Cruze com o listing COBOL.


🔥 O MOMENTO JEDI

Você pega:

  • PSW

  • offset

  • compile listing

E encontra:

CALL WS-PGM

Boom.

Caso resolvido.


☕ O S0C1 E O JCL

Outro clássico:

//STEPLIB DD DSN=LIB.ERRADA

Programa carrega versão incompatível.

Resultado:

💥 S0C1


🔥 O S0C1 E O AMODE/RMODE

Agora entramos no modo arquimago mainframe.

Problemas entre:

  • AMODE 24

  • AMODE 31

  • AMODE 64

podem causar branches inválidos.


☕ O S0C1 E O LE (LANGUAGE ENVIRONMENT)

Às vezes:

  • LE incompatível

  • runtime quebrado

  • mismatch de compilação

também geram S0C1.


🔥 COMO EVITAR S0C1


✅ Validar CALL dinâmico


✅ Não usar nomes vazios


✅ Evitar overlays


✅ Validar subscripts


✅ Revisar LINKEDIT


✅ Conferir STEPLIB/JOBLIB


✅ Usar SSRANGE

Grande arma contra corrupção de tabela.


☕ O SSRANGE — ESCUDO DOS PADAWANS

Compilar com:

SSRANGE

faz COBOL detectar acesso inválido em tabela.

Sem isso:

corrupção silenciosa.


🔥 CURIOSIDADE HISTÓRICA

O S0C1 vem das arquiteturas System/360.

Década de:

🏛️ 1960

Estamos falando de um erro nascido literalmente junto com a computação corporativa moderna.


☕ EASTER EGG MAINFRAME

Veteranos brincam:

“S0C1 é a CPU dizendo:

EU NÃO FAÇO IDEIA DO QUE VOCÊ MANDOU EXECUTAR.”


🔥 O MAIOR ERRO DO JÚNIOR

Ver:

S0C1

e assumir:

“o COBOL está errado.”

Não.

Frequentemente:

  • ambiente

  • load module

  • memória

  • linkage

  • call

  • JCL

são os culpados.


☕ A VERDADE FINAL

O S0C7 quebra números.
O S0C4 quebra memória.
Mas…

☕ O S0C1 QUEBRA A PRÓPRIA LINGUAGEM DA CPU.

Porque naquele instante…

O IBM Z PAROU DE ENTENDER O QUE ESTAVA SENDO EXECUTADO.