☕ Um Café no Bellacosa Mainframe
Gostou do conteúdo? Ajude a manter o café quente, o COBOL compilando e o mainframe acordado. 😄
☕ Pague um café ao Bellacosa

Translate

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

quinta-feira, 21 de maio de 2026

☕🔥 Guia Completo — ABENDs Clássicos do IBM OS/VS e z/OS

Bellacosa Mainframe e a lista de abends


☕🔥 Guia Completo — ABENDs Clássicos do IBM OS/VS e z/OS

Excelente observação!
No resumo anterior realmente ficaram faltando vários ABENDs importantes da lista original do artigo histórico do OS/VS. Agora segue a versão completa, revisada e expandida, incluindo TODOS os códigos mencionados no documento.


🔥 S013 — OPEN ERROR / DCB ERROR

Mensagem comum

IEC141I

O que significa

Falha ao abrir dataset.

Principais causas

  • BLKSIZE incompatível

  • RECFM incorreto

  • LRECL errado

  • Membro inexistente em PDS

Muito comum em

  • SORT

  • COBOL batch

  • IDCAMS


🔥 S0C1 — OPERATION EXCEPTION

O que significa

Execução de instrução inválida.

Causas

  • Overlay de memória

  • Programa corrompido

  • Executar área de dados como código

  • Compilação/link incorreto


🔥 S0C4 — PROTECTION EXCEPTION

O clássico absoluto do z/OS

O que significa

Acesso inválido à memória.

Causas comuns

  • Subscript fora do limite

  • Ponteiro inválido

  • Tabela ultrapassada

  • LINKAGE SECTION incorreta


🔥 S0C5 — ADDRESSING EXCEPTION

O que significa

Tentativa de acessar endereço inexistente.

Muito comum em

  • CALLs errados

  • Parâmetros incompatíveis

  • Ponteiros inválidos


🔥 S0C7 — DATA EXCEPTION

O ABEND mais famoso do COBOL

O que significa

Campo numérico contém valor inválido.

Exemplos clássicos

MOVE 'ABC' TO WS-VALOR-NUM
ADD 1 TO WS-VALOR-NUM

Principais causas

  • Campo COMP-3 corrompido

  • Dados não numéricos

  • Index fora da tabela

  • Working-storage sem inicialização


🔥 S106 — LINK/LOAD ERROR

O que significa

Falha durante LOAD ou LINK.

Causas

  • Biblioteca incorreta

  • Módulo inconsistente

  • Problema de disco


🔥 S213 — DATASET NOT FOUND

Mensagem comum

IEC143I

O que significa

Dataset inexistente.

Causas

  • DSNAME errado

  • Dataset não catalogado

  • VOL=SER incorreto


🔥 S222 — JOB CANCELADO

Mensagem comum

IEF301I

O que significa

Operador cancelou o job.

Normalmente ocorre por

  • Loop infinito

  • Job preso

  • Alto consumo


🔥 S2F3 — SYSTEM FAILURE

O que significa

Falha do sistema operacional durante execução.

Causas

  • Crash do sistema

  • IPL

  • Problema interno do z/OS

Procedimento

  • Reexecutar o job

  • Verificar logs do sistema


🔥 S322 — TIME EXCEEDED

O que significa

Job excedeu o tempo permitido.

Muito comum em

  • Loops infinitos

  • SQL sem índice

  • SORT gigantes

Exemplo

TIME=1

🔥 S613 — TAPE I/O ERROR

Mensagem comum

IEC147I

O que significa

Erro de I/O em fita magnética.

Causas

  • Fita mal posicionada

  • Multi-volume incorreto

  • Problema físico na fita


🔥 S722 — SYSOUT LIMIT EXCEEDED

O que significa

Quantidade de linhas impressas excedeu limite.

Muito comum em

  • LOOP com DISPLAY

  • Relatórios infinitos

  • Dumps excessivos


🔥 S804 — INSUFFICIENT VIRTUAL STORAGE

O que significa

Falta de memória virtual.

Causas

  • REGION pequena

  • Programa gigante

  • Uso excessivo de tabelas

Exemplo

REGION=512K

🔥 S806 — MODULE NOT FOUND

O loader não encontrou o módulo

Causas

  • STEPLIB errada

  • LOADLIB ausente

  • Nome incorreto do programa

Mensagem clássica

CSV003I REQUESTED MODULE NOT FOUND

🔥 S80A — STORAGE SHORTAGE

O que significa

Complemento do S804.

Causa principal

Falta de memória virtual disponível.


🔥 S813 — TAPE LABEL ERROR

Mensagem comum

IEC149I

O que significa

Nome do dataset na fita não bate com DD.

Causas

  • LABEL incorreto

  • DSNAME errado

  • Volume errado


🔥 S913 — RACF SECURITY VIOLATION

Mensagem comum

IEC150I

O que significa

Acesso negado pelo RACF.

Muito comum em

  • Produção

  • Db2

  • GDGs

  • VSAM corporativo


🔥 SA13 — END OF TAPE / FILE NOT FOUND

Mensagem comum

IEC151I

O que significa

Arquivo não encontrado na fita.

Causas

  • LABEL incorreto

  • Número sequencial errado

  • Volume incorreto


🔥 SB37 — OUT OF SPACE

Mensagem comum

IEC030I

O que significa

Dataset ficou sem espaço.

Causas

  • Espaço secundário insuficiente

  • Muitas extents

  • Volume cheio


🔥 SD37 — NO SECONDARY SPACE

Mensagem comum

IEC031I

O que significa

Acabou espaço primário e não existe secondary allocation.

Exemplo clássico

SPACE=(CYL,(10,0))

🔥 SE37 — EXTENT LIMIT EXCEEDED

Mensagem comum

IEC032I

O que significa

Dataset atingiu limite máximo de extents.

Muito comum em

  • PDS antigos

  • SORT gigantes

  • Arquivos temporários


☕🔥 Os ABENDs Mais Icônicos da História do Mainframe

ABENDSignificado
S0C7Data Exception
S0C4Protection Exception
S806Module Not Found
S913RACF Violation
SB37Dataset sem espaço
S322Timeout
S213Dataset não encontrado

☕ Curiosidade Histórica

Nos tempos do:

  • OS/360

  • OS/VS1

  • OS/VS2

  • MVS/XA

os operadores praticamente decoravam os ABENDs “na raça”.

Muitos programadores COBOL antigos conseguiam identificar o erro apenas olhando:

IEF450I

ou:

IEC141I

sem precisar abrir dump.

Isso virou quase uma “linguagem secreta” do mundo mainframe.


sexta-feira, 27 de março de 2026

🔥 COBOL NÃO QUEBROU… FOI O RTM QUE DECIDIU O DESTINO

 

Bellacosa Mainframe explica rtm o grande guarda-costas.

🔥 COBOL NÃO QUEBROU… FOI O RTM QUE DECIDIU O DESTINO

Se você trabalha com COBOL há anos, já viu isso acontecer:

💥 S0C7
💥 S0C4
💥 S878
…e aquele silêncio constrangedor no batch.

E aí vem a pergunta clássica:

👉 “O que aconteceu?”

Errado.

A pergunta certa é:

🧠 “O que o z/OS fez quando isso aconteceu?”

Porque no exato momento do ABEND…
quem assume o controle não é o seu programa.

É o RTM — Recovery Termination Manager.


🧠 O RTM: o juiz invisível do seu programa

O RTM é um componente do z/OS que entra em ação sempre que algo relevante acontece:

  • ✔️ Erro
  • ✔️ Falha
  • ✔️ Terminação normal (sim!)

👉 Ele é responsável por:

  • Capturar o erro
  • Tentar recuperar
  • Decidir o destino
  • Registrar tudo

💡 Tradução Bellacosa:

🔥 “O RTM é quem decide se seu programa vive… ou vira dump.”


🚨 Quando o ABEND acontece (o bastidor real)

Você vê:

S0C7 – erro de dados

O RTM vê:

  • Tipo de exceção
  • Estado da CPU (PSW)
  • Registradores
  • Control blocks
  • Contexto da task

👉 E imediatamente inicia o fluxo:

Erro → RTM → Recovery → Decisão → Dump → Investigação

💡 Isso acontece em milissegundos.


⚙️ Os serviços do RTM (o que ele realmente faz)

1️⃣ Captura do erro (o “detetive”)

O RTM intercepta:

  • Program checks (S0C4, S0C7…)
  • I/O errors
  • Machine checks
  • Falhas de memória

👉 Ele coleta o estado completo do sistema.

💡 Easter egg:

O SDWA é criado aqui — é literalmente o “snapshot do crime”.


2️⃣ Tentativa de recuperação (o “paramédico”)

Aqui entram os famosos:

  • ESTAE → nível da aplicação
  • FRR → nível do sistema

👉 O RTM pergunta:

“Alguém consegue salvar isso?”

💡 Curiosidade:

  • Muitos sistemas robustos usam ESTAE para evitar queda total
  • COBOL “puro” raramente usa diretamente… mas se beneficia disso sem saber

3️⃣ Decisão (o “juiz”)

Depois da tentativa:

  • Continua execução?
  • Finaliza a task?
  • Derruba o address space?

👉 Essa decisão é crítica.

💡 Insight:

Nem todo erro vira ABEND visível — alguns são absorvidos


4️⃣ Geração de evidência (o “perito”)

O RTM gera:

  • SYSUDUMP / SYSABEND / SYSMDUMP
  • SVC dump
  • LOGREC

👉 Isso vira seu material de análise.

💡 Frase forte:

Sem dump, você está cego.


🧹 RTM também limpa a bagunça (e isso é pouco falado)

Agora vem o que pouca gente sabe:

🔥 O RTM também atua quando TUDO DÁ CERTO

Quando seu job termina normalmente:

  • Fecha datasets
  • Libera memória
  • Cancela timers
  • Remove enqueues
  • Limpa control blocks

👉 Isso é feito de forma extremamente eficiente.

💡 Comentário Bellacosa:

“Se o RTM não limpasse… o z/OS virava um lixão em minutos”


🧩 RTM1 vs RTM2 (nível raiz)

🔹 RTM1 (System Level)

  • Falhas do sistema
  • Interface com FRR

🔹 RTM2 (Task Level)

  • Programas (COBOL aqui 👈)
  • Interface com ESTAE

👉 Fluxo clássico:

Erro
↓
RTM1
↓
FRR
↓
RTM2
↓
ESTAE
↓
Decisão

💡 Isso é arquitetura de verdade.


📦 Dumps: o presente que ninguém quer… mas precisa

Tipos que você já viu:

  • SYSUDUMP → básico
  • SYSABEND → completo
  • SYSMDUMP → raiz (hex)

👉 E os de sistema:

  • SVC Dump
  • Standalone Dump

💡 Dica prática:

🔥 “Se o problema é estranho… peça SYSMDUMP”


🗂️ LOGREC: o histórico que salva sua vida

LOGREC guarda:

  • Erros de hardware
  • Eventos do sistema
  • Condições críticas

💡 Dica de ouro:

👉 Sempre comece por LOGREC antes do dump


🧠 SLIP e DAE (nível ninja)

🔹 SLIP

  • Armadilha de erro
  • Dispara dump sob condição

🔹 DAE

  • Evita dumps duplicados

💡 Produção sem isso:

caos + storage cheio


💥 Aplicação prática (COBOL raiz)

S0C7 — o clássico

👉 Normalmente:

  • Dado inválido em campo numérico

Mas o RTM te dá:

  • Instrução que falhou
  • Endereço
  • Conteúdo do campo

💡 Dica prática:

  1. Veja PSW
  2. Ache a instrução
  3. Verifique o dado
  4. Volte no código

🧠 Insight final (o que separa níveis)

❌ Júnior: “Deu S0C7”
❌ Pleno: “Campo inválido”
✅ Sênior: “Eu sei exatamente onde e por quê”


🏁 Conclusão (sem mimimi)

O RTM é:

  • 🔥 O guardião da estabilidade
  • 🔍 O perito do erro
  • ⚖️ O juiz da execução
  • 🧹 O faxineiro do sistema

💬 Frase pra levar pra vida

“COBOL não quebra…
o RTM só revela o que já estava errado.”

 

domingo, 8 de fevereiro de 2026

🔥 SEU PROGRAMA NÃO “ENXERGA” MEMÓRIA… ELE NEGOCIA COM O z/OS 😳 O guia proibido da Addressability que separa dev COBOL de engenheiro de sistema

 

Bellacosa Mainframe em uma viagem ao Addressability do z/os

🔥 SEU PROGRAMA NÃO “ENXERGA” MEMÓRIA… ELE NEGOCIA COM O z/OS 😳

O guia proibido da Addressability que separa dev COBOL de engenheiro de sistema

Você acha que seu COBOL acessa memória direto?

👉 Não acessa.

No mainframe, nada é direto.
Tudo passa por:

  • tradução
  • autorização
  • tabelas
  • registradores
  • controle do sistema

Se você não entende isso…
👉 você nunca vai dominar dump, performance ou abend 💀


🧠 O QUE É ADDRESSABILITY (SEM ENROLAR)

Addressability é:

a capacidade de um programa acessar dados — onde quer que eles estejam


💡 Tradução Bellacosa

“Addressability é o GPS + chave + autorização da memória.”


⚙️ 1. DISPATCHING WORK — ONDE TUDO COMEÇA

Quando sua task roda:

  • dispatcher escolhe
  • CPU assume
  • CR1 é carregado

👉 CR1 aponta para o address space ativo


🔥 Insight

CR1 define “qual mundo você está enxergando”


🌍 2. VIRTUAL STORAGE — O UNIVERSO NÃO É REAL

Cada usuário tem:

👉 seu próprio universo de memória


🔹 Características:

  • até 16 exabytes 😳
  • isolado
  • protegido

💡 História

MVS = Multiple Virtual Storage

👉 desde os anos 70 já fazia isso


🧨 Easter Egg

Você acha que está acessando memória real…

👉 está acessando endereço virtual traduzido


🧩 3. ADDRESS SPACE — SUA “BOLHA”

Tudo roda dentro de:

👉 um address space


🔹 Tipos:

  • Batch
  • TSO
  • Started Task

💡 Insight

cada programa vive isolado


🔗 4. CROSS MEMORY — QUEBRANDO A BOLHA

Mas… o sistema permite sair dela.


🔹 O que é?

Acessar outro address space


🔥 Exemplo real

COBOL → chama serviço → DB2 → retorna

👉 são address spaces diferentes


💡 Estados:

  • Home → origem
  • Primary → execução
  • Secondary → dados

🧨 Curiosidade

Se são diferentes:

👉 você está em cross-memory mode


🚀 5. PROGRAM CALL (PC) — O TELEPORTE DO z/OS

🔹 O que faz?

  • troca de address space
  • mantém controle
  • permite retorno

🔥 Fluxo real

User → LLA → VLF → módulo → volta

👉 tudo invisível


💡 Tradução

PC é um “portal controlado”


🧱 6. LINKAGE STACK — A MEMÓRIA DA EXECUÇÃO

Sempre que um programa chama outro:

👉 estado é salvo automaticamente


🔹 Salva:

  • registradores
  • PSW
  • access registers

💡 Vantagens

  • menos erro
  • suporte a reentrância
  • debug mais limpo

🧨 Curiosidade

Substitui os antigos save areas


⚙️ 7. ACCESS REGISTERS — O PODER ESCONDIDO

🔹 O que são?

  • 16 registradores
  • permitem acessar outros espaços

🔥 Funcionamento

AR → qual espaço
GR → qual dado

💡 Tradução Bellacosa

AR = endereço do universo
GR = endereço dentro do universo


🧠 8. ACCESS LIST / ALET / ALE — CONTROLE DE ACESSO

Nada é livre.


🔹 Processo:

  1. obter S-token
  2. ALESERV
  3. criar ALE
  4. gerar ALET
  5. carregar AR

💡 Insight

acesso exige autorização formal


🧨 Curiosidade

Sem isso:

👉 proteção de memória bloqueia acesso


⚡ 9. ADDRESSABILITY MODES

🔹 AMODE

  • 24-bit
  • 31-bit
  • 64-bit

🔹 RMODE

  • onde o programa carrega

💡 História

Compatibilidade com décadas de software


🔄 10. PASSO A PASSO COMPLETO

Task é despachada
↓
CR1 define address space
↓
Programa executa
↓
Se precisar:
→ PC (outro space)
→ AR (outro data space)
↓
Linkage stack salva estado
↓
Retorno

💀 ONDE ISSO APARECE NA VIDA REAL?

🔥 Dump (IPCS)

Você vê:

  • PSW
  • registers
  • ARs
  • linkage stack

🔥 Abend clássico

👉 S0C4 = erro de addressability


🔥 Performance

  • cross memory custa
  • LPA melhora

🧨 CURIOSIDADES (NÍVEL JEDI)

🤯 1. Um programa pode acessar vários universos ao mesmo tempo


🔥 2. Memória é totalmente virtual


💀 3. Um erro de ponteiro quebra tudo (S0C4)


🧠 4. O sistema controla TUDO via tabelas


🎯 RESUMO FINAL

✔ Addressability = acesso controlado

✔ Address space = isolamento

✔ Cross memory = comunicação

✔ PC = chamada entre espaços

✔ AR = acesso avançado

✔ Linkage stack = estado


💥 FRASE FINAL

“No mainframe, memória não é um lugar… é um privilégio concedido pelo sistema.”

 

terça-feira, 20 de agosto de 2024

Debugando programa COBOL

Bellacosa Mainframe e o debug em cobol

☕ Um Café no Bellacosa Mainframe

Professor Pardal Entra no Abend: a Arte de Debugar COBOL sem Transformar Produção em Patópolis

🐔🔧 S0C7, S0C4, dumps, CEEDUMP, SYSOUT, DISPLAY, offsets, compile listings, Db2, CICS e a velha ciência de descobrir por que um programa que “funcionava ontem” resolveu explodir hoje

Existe uma frase particularmente perigosa no universo mainframe:

“Mas esse programa nunca deu problema.”

Meu jovem Padawan...

Um programa COBOL que está há 27 anos em produção não está necessariamente correto.

Ele pode simplesmente estar há 27 anos esperando o registro certo para explodir.

Então chega terça-feira.

02:47 da manhã.

O telefone toca.

JOB CLIENTE ABENDED
SYSTEM COMPLETION CODE=0C7

Silêncio.

Alguém pergunta:

— Quem alterou o programa?

Resposta:

— Ninguém.

Outra pessoa:

— Mudaram o arquivo?

— Não.

— Db2?

— Não.

— JCL?

— Também não.

Nesse momento, uma pequena porta se abre no CPD.

Entra um galo antropomórfico de chapéu, óculos e ferramentas.

Professor Pardal.

Ele olha para o dump.

Olha para o programador.

Olha novamente para o dump.

E provavelmente pergunta:

“Você leu a mensagem de erro?”

Porque antes de inventarmos observabilidade, AIOps, telemetry, tracing e outras palavras capazes de consumir três slides cada...

já existia uma técnica extraordinariamente eficiente:

LER A PORRA DO ERRO.

Bem-vindo ao maravilhoso mundo do debug COBOL.


🐔 Professor Pardal assume o plantão

Nos quadrinhos Disney, Professor Pardal é aquele inventor capaz de construir praticamente qualquer coisa.

Máquinas impossíveis.

Robôs.

Veículos.

Dispositivos absurdos.

Soluções para problemas que ninguém sabia que possuía.

E frequentemente suas invenções criam problemas ainda maiores.

Ou seja:

perfeitamente qualificado para desenvolvimento corporativo.

Ele também possui um pequeno ajudante robótico chamado Lampadinha.

Portanto nossa arquitetura está pronta:

PROFESSOR PARDAL
      |
      +---- Programador COBOL
      |
      +---- Lampadinha
              |
              +---- IA generativa

Agora precisamos descobrir por que:

COMPUTE WS-TOTAL =
        WS-QUANTIDADE * WS-VALOR.

mandou nosso JOB diretamente para Valhalla.


🧠 Debug não significa olhar código

Primeira lição do Professor Pardal:

debug é investigação.

Existe uma diferença enorme.

O programador desesperado abre o código e começa:

rolando...

rolando...

rolando...

rolando...

Até encontrar alguma coisa que parece suspeita.

Então altera.

Compila.

Executa.

Falha.

Altera outra coisa.

Compila.

Executa.

Falha diferente.

Parabéns.

Você não está fazendo debugging.

Está praticando:

Programação Orientada a Superstição™

Professor Pardal jogaria uma chave inglesa em sua cabeça.

O processo correto começa com evidência.


🔎 1. Qual foi exatamente o ABEND?

Antes de olhar código:

QUAL JOB?
QUAL STEP?
QUAL PROGRAMA?
QUAL ABEND?
QUAL OFFSET?
QUAL ARQUIVO?
QUAL REGISTRO?
QUAL SQLCODE?
QUAL TRANSAÇÃO?

Imagine:

JOBNAME  : FATURA01
STEP     : STEP030
PROGRAM  : FATU120
ABEND    : S0C7

Já sabemos muita coisa.

S0C7 normalmente aponta para uma data exception.

Em linguagem Bellacosa:

alguma operação decimal encontrou algo que não deveria estar ali.

Você esperava:

12345

Recebeu:

12A45

COBOL olhou aquilo.

Pensou por aproximadamente três nanossegundos.

E decidiu:

VAI TOMAR NO CU.

S0C7.

💥 S0C7 — o clássico

Talvez seja o ABEND mais famoso do universo COBOL.

Imagine:

01 WS-VALOR PIC 9(05).

MOVE '12A45' TO WS-VALOR.

ADD 1 TO WS-VALOR.

A movimentação pode deixar dados incompatíveis com aquilo que posteriormente será tratado como numérico.

Quando uma instrução decimal tenta utilizar o campo...

💥

SYSTEM COMPLETION CODE=0C7

Professor Pardal imediatamente pergunta:

De onde veio WS-VALOR?

Essa pergunta vale ouro.

Porque frequentemente o erro não está na instrução que explodiu.

A instrução apenas encontrou o cadáver.


🕵️ A cena do crime

Considere:

READ ARQ-CLIENTES
   AT END
      SET EOF TO TRUE
   NOT AT END
      MOVE CLI-VALOR TO WS-VALOR
END-READ.

...

COMPUTE WS-TOTAL = WS-VALOR * WS-TAXA.

O COMPUTE explode.

Quem é acusado?

COMPUTE

Mas talvez o verdadeiro assassino tenha acontecido vinte instruções antes:

MOVE CLI-VALOR TO WS-VALOR

E talvez CLI-VALOR tenha vindo de:

ARQUIVO

que veio de:

SORT

que veio de:

OUTRO PROGRAMA

que veio de:

DB2

que recebeu dados de:

API

que recebeu alguma porcaria enviada por alguém.

Bem-vindo ao debugging corporativo.


🗺️ O mapa do Professor Pardal

Uma investigação eficiente pode ser visualizada assim:

ABEND
  ↓
STEP
  ↓
PROGRAMA
  ↓
OFFSET
  ↓
INSTRUÇÃO
  ↓
VARIÁVEIS
  ↓
ORIGEM DOS DADOS
  ↓
REGISTRO
  ↓
CAUSA

Não:

ABEND
  ↓
PÂNICO
  ↓
ALTERA QUALQUER COISA
  ↓
COMPILA
  ↓
REZA

Essa segunda metodologia é bastante popular.


📜 2. Leia o dump

Ah, o dump.

Aquele maravilhoso documento de 18 quilômetros que aparece no spool.

O programador iniciante abre:

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
HEX HEX HEX HEX HEX HEX HEX HEX
REGISTER REGISTER REGISTER
STORAGE STORAGE STORAGE

Fecha.

E declara:

“Não dá para entender.”

Professor Pardal sorri.

Porque o dump não foi criado para ser bonito.

Foi criado para contar o que existia na memória quando o programa morreu.

É a autópsia.


🧬 CEEDUMP

Em ambientes Language Environment, podemos encontrar informações extremamente úteis no CEEDUMP.

Dependendo da configuração e do problema, você pode conseguir identificar:

  • programa;

  • condição;

  • offset;

  • traceback;

  • rotina;

  • registradores;

  • storage;

  • contexto da falha.

Você não precisa compreender imediatamente cada byte.

Primeiro procure aquilo que reduz o universo da investigação.

Se seu programa possui 25.000 linhas e você descobre aproximadamente onde ocorreu a falha...

já eliminou uma enorme quantidade de Patópolis.


📐 3. O offset é seu amigo

Imagine uma mensagem apontando algo semelhante a:

PROGRAM FATU120
OFFSET X'00001A7C'

Agora temos uma coordenada.

Precisamos relacioná-la ao código compilado.

É aqui que o compile listing se torna extremamente importante.

Dependendo do compilador, opções utilizadas e informações disponíveis, podemos correlacionar offsets com statements/instruções.

Professor Pardal abre sua bancada:

ABEND
+
OFFSET
+
COMPILE LISTING
=
LOCALIZAÇÃO PROVÁVEL

Agora nossa investigação saiu de:

“Existe algum problema no programa.”

para:

“Existe alguma coisa errada nesta região.”

Isso muda tudo.


📚 Compile listing não é papel para alimentar impressora

Durante anos conheci programadores que tratavam listing como aquele negócio gigantesco produzido depois da compilação.

Errado.

Ele pode ser uma verdadeira radiografia do programa.

Dependendo das opções de compilação, encontramos informações sobre:

SOURCE
CROSS-REFERENCE
DATA MAP
PROCEDURE MAP
OFFSETS
MESSAGES
OPTIMIZATION

O velho:

XREF

pode ser particularmente interessante.

Quer saber onde determinada variável aparece?

Em vez de executar:

CTRL+F
CTRL+F
CTRL+F
CTRL+F

você pode analisar suas referências.


🐔 Professor Pardal pergunta: “Quem mexeu nesta variável?”

Imagine:

01 WS-SALDO PIC S9(09)V99 COMP-3.

Você encontra problema em WS-SALDO.

Pergunta:

Quem escreve nele?

Talvez:

01230 MOVE DB2-SALDO TO WS-SALDO
01870 ADD WS-JUROS TO WS-SALDO
02410 MOVE ZERO TO WS-SALDO
03150 COMPUTE WS-SALDO = ...

Agora temos suspeitos.

Debugging começa a parecer investigação criminal.

Porque essencialmente é.


🔦 Lampadinha recomenda DISPLAY

E chegamos à ferramenta mais sofisticada já inventada pela humanidade.

DISPLAY.

Sim.

Pode rir.

Temos ferramentas modernas de debugging.

IDEs.

Debuggers interativos.

Tracing.

Observabilidade.

Ferramentas comerciais excelentes.

Mas existe um momento na carreira de todo COBOLzeiro em que aparece:

DISPLAY 'ENTREI AQUI'.

Depois:

DISPLAY 'WS-VALOR=' WS-VALOR.

Depois:

DISPLAY 'ANTES DO COMPUTE'.

E finalmente:

DISPLAY 'MEU DEUS CHEGOU AQUI'.

É feio?

Sim.

Funciona?

ABSOLUTAMENTE.


⚠️ Mas DISPLAY também pode virar arma de destruição

Professor Pardal faz uma advertência.

Imagine:

PERFORM UNTIL EOF
   READ ARQUIVO
   DISPLAY REGISTRO-INTEIRO
END-PERFORM.

Arquivo:

83.000.000 registros

JES2:

VOCÊ TEM CERTEZA DISSO, FILHO?

Portanto DISPLAY deve ser usado com inteligência.

Talvez:

IF WS-CONTADOR < 100
   DISPLAY ...
END-IF

Ou somente quando determinada condição ocorrer:

IF WS-CLIENTE = 123456
   DISPLAY ...
END-IF

Debugging não deveria provocar um novo incidente.

Embora isso torne a história muito melhor depois.


🧯 S0C4 — entrou onde não deveria

Outro clássico:

S0C4

De maneira simplificada, estamos frequentemente olhando para algum problema de acesso à memória/storage, endereço inválido ou operação relacionada.

É uma família de situações que exige analisar contexto.

Ponteiros.

Índices.

Subscripts.

CALLs.

Parâmetros.

Storage.

Professor Pardal imediatamente procura coisas como:

SET ADDRESS OF ...

ou tabelas:

01 TABELA.
   05 ITEM OCCURS 100 TIMES.

e alguém fazendo:

ITEM(347)

A tabela possui 100 posições.

O programador quer acessar 347.

COBOL responde:

interessante.

O sistema responde:

S0C4.


📦 SSRANGE — o cinto de segurança

Durante desenvolvimento e testes, opções como SSRANGE podem ajudar enormemente na identificação de problemas relacionados a referências fora dos limites permitidos.

É o equivalente COBOL de colocar Professor Pardal ao lado da tabela dizendo:

“Meu amigo, existem 100 posições aqui. Por que você está tentando acessar a 347?”

Naturalmente existe custo associado às verificações adicionais, portanto decisões de compilação para desenvolvimento, teste e produção precisam considerar o ambiente e as políticas da organização.

Mas durante diagnóstico?

Pode ser extremamente útil.


🧮 COMP-3: onde mora o demônio hexadecimal

Agora entramos numa região particularmente divertida.

Packed decimal.

PIC S9(7)V99 COMP-3.

O programador iniciante olha um dump hexadecimal e pensa:

Satanás.

O COBOLzeiro experiente olha:

12 34 56 78 9C

e pensa:

Ah, 1234567,89 positivo.

E continua tomando café.

Campos COMP-3 são eficientes e tradicionais no processamento decimal empresarial.

Mas quando dados inválidos entram nesse território...

o S0C7 começa a afiar a faca.


🧪 TESTE O DADO, NÃO SUA FÉ

Uma das grandes lições do debugging é:

nunca confie cegamente na entrada.

“Mas o arquivo vem de outro sistema.”

Maravilha.

Outro sistema também possui programadores.

“Mas vem do banco.”

Ótimo.

“Mas existe validação.”

Excelente.

Mesmo assim:

VALIDATE.

Porque sistemas antigos frequentemente acumulam décadas de exceções, migrações, conversões e pequenas decisões históricas.

O campo chamado:

DATA-NASCIMENTO

pode conter:

00000000
99999999
20260231
        

e algum valor que ninguém consegue explicar desde 1987.


🗄️ Quando o culpado é Db2

Agora nosso programa executa SQL.

EXEC SQL
   SELECT SALDO
     INTO :WS-SALDO
     FROM CLIENTE
    WHERE ID = :WS-ID
END-EXEC.

Professor Pardal pergunta imediatamente:

SQLCODE?
SQLSTATE?

Não faça isto:

EXEC SQL
   ...
END-EXEC

CONTINUE.

Faça tratamento adequado.

Porque:

SQLCODE = 0

é uma história.

SQLCODE = +100

é outra.

Valores negativos contam histórias ainda mais interessantes.

Um bom debug de aplicação Db2 exige entender não apenas COBOL, mas a conversa entre:

PROGRAMA
   ↕
SQL
   ↕
DB2

🏦 CICS: agora o pato ficou bravo

Batch já é divertido.

Então entramos no CICS.

Agora temos:

TRANSACTION
COMMAREA
CHANNELS
CONTAINERS
RESP
RESP2
EIBRESP
EIBRCODE
MAPAS
TSQ
TDQ
FILES
DB2
MQ

E o usuário diz:

“A tela fechou.”

Excelente descrição técnica.

Professor Pardal pergunta:

Qual transação?

Usuário:

“Aquela azul.”

Bem-vindo ao suporte.


🚨 RESP e RESP2

Uma prática importantíssima no CICS é não tratar comandos como se fossem infalíveis.

Exemplo conceitual:

EXEC CICS READ
     FILE('CLIENTE')
     INTO(WS-REGISTRO)
     RIDFLD(WS-CHAVE)
     RESP(WS-RESP)
     RESP2(WS-RESP2)
END-EXEC.

Agora conseguimos investigar.

Em vez de:

NÃO FUNCIONOU

temos informação sobre a resposta da operação.

Debugging é justamente isso:

transformar “não funciona” em evidência mensurável.


🧠 Professor Pardal apresenta o método científico

A melhor maneira de debugar COBOL não é decorar ABENDs.

É pensar como cientista.

Temos:

OBSERVAÇÃO
    ↓
HIPÓTESE
    ↓
TESTE
    ↓
EVIDÊNCIA
    ↓
CONCLUSÃO

Exemplo:

Observação

S0C7 durante cálculo.

Hipótese

WS-VALOR contém dados não numéricos.

Teste

Inspecionar campo imediatamente antes da operação.

Evidência

WS-VALOR = '00012A45'

Nova pergunta

Quem colocou A ali?

Seguimos para trás.

Isso é debugging.


❌ O anti-debug

O método corporativo alternativo é:

S0C7
 ↓
"DEVE SER O DB2"
 ↓
DBA INVESTIGA
 ↓
NÃO É DB2
 ↓
"DEVE SER INFRA"
 ↓
INFRA INVESTIGA
 ↓
NÃO É INFRA
 ↓
"SERÁ A REDE?"
 ↓
NETWORK INVESTIGA
 ↓
NÃO É REDE
 ↓
3 HORAS DE WAR ROOM
 ↓
CAMPO NUMÉRICO CONTINHA 'X'

Professor Pardal abandona Patópolis.


🤖 Lampadinha ganhou IA generativa

Agora chegamos a 2026.

Imagine Professor Pardal com uma Lampadinha equipada com IA.

Você fornece:

ABEND
dump
compile listing
trecho COBOL
copybook
JCL
mensagens

E pergunta:

“Quais são as hipóteses mais prováveis?”

Isso pode acelerar brutalmente a investigação.

IA pode ajudar a:

  • interpretar mensagens;

  • explicar código legado;

  • correlacionar variáveis;

  • sugerir pontos de inspeção;

  • construir hipóteses;

  • explicar hexadecimal;

  • analisar fluxos;

  • sugerir casos de teste.

Mas existe uma regra fundamental:

IA NÃO TRANSFORMA HIPÓTESE EM EVIDÊNCIA.

Se Lampadinha disser:

“Provavelmente WS-VALOR possui dado inválido.”

Excelente.

Agora prove.


🧠 IA pode alucinar. Dump não.

Esta frase deveria estar colada em toda War Room moderna.

IA:
"Talvez seja..."

DUMP:
"ERA ISTO."

Use IA como copiloto investigativo.

Não como oráculo.

Especialmente em ambientes críticos.

E jamais copie dumps de produção contendo dados sensíveis para serviços externos sem autorização, mascaramento e respeito às políticas de segurança.

Professor Pardal é maluco.

Mas RACF continua observando.


🔐 DEBUG também é segurança

Essa parte frequentemente é esquecida.

Dump pode conter:

CPF
CONTA
NOME
TOKEN
CARTÃO
ENDEREÇO
DADOS FINANCEIROS
CHAVES
CREDENCIAIS

DISPLAY também pode colocar dados sensíveis no spool.

Logs permanecem.

SYSOUT permanece.

Ferramentas armazenam informações.

Portanto:

DEBUG ≠ LIBEROU GERAL

Em produção, diagnóstico precisa respeitar controles de segurança e privacidade.


🧰 A caixa de ferramentas do Professor Pardal

Nosso laboratório COBOL pode conter várias ferramentas e técnicas:

ABEND MESSAGES
SYSOUT
JES/SDSF
DUMP
CEEDUMP
COMPILE LISTING
XREF
OFFSET
DISPLAY
SSRANGE
TEST OPTIONS
DEBUGGERS
FAULT ANALYSIS TOOLS
FILE INSPECTION
DB2 DIAGNOSTICS
CICS DIAGNOSTICS
SMF
LOGS

Nenhuma ferramenta substitui raciocínio.

Porque o problema fundamental continua sendo:

O que o programa deveria fazer e o que ele realmente fez?

Essa diferença é o território do debugger.


🧭 O algoritmo Bellacosa-Pardal de Debug COBOL™

Quando alguma coisa explodir:

1. NÃO ENTRE EM PÂNICO
        ↓
2. IDENTIFIQUE JOB/STEP/PROGRAMA
        ↓
3. LEIA O ABEND/MENSAGEM
        ↓
4. PROCURE OFFSET/TRACEBACK
        ↓
5. CONSULTE O LISTING
        ↓
6. IDENTIFIQUE A INSTRUÇÃO
        ↓
7. INSPECIONE AS VARIÁVEIS
        ↓
8. DESCUBRA QUEM AS ALTEROU
        ↓
9. RASTREIE A ORIGEM DOS DADOS
        ↓
10. CRIE UMA HIPÓTESE
        ↓
11. TESTE
        ↓
12. REPRODUZA
        ↓
13. CORRIJA A CAUSA
        ↓
14. FAÇA TESTE DE REGRESSÃO
        ↓
15. DOCUMENTE

Observe o item 13:

CORRIJA A CAUSA.

Não simplesmente o sintoma.


🩹 O remendo que cria o monstro

Programa:

IF WS-VALOR IS NUMERIC
   COMPUTE ...
END-IF.

Problema desapareceu.

CABÔ!

Talvez.

Mas espere.

Por que WS-VALOR não era numérico?

Se deveria obrigatoriamente ser...

você acabou de esconder um problema de qualidade de dados.

O programa não explode mais.

Agora apenas ignora silenciosamente dinheiro.

Excelente.

Transformamos um S0C7 visível em um erro contábil invisível.

Professor Pardal começa a suar frio.


🧪 Corrigir não é provar

Depois da alteração:

“Funcionou.”

Não significa:

“Está correto.”

Precisamos testar:

CASO ORIGINAL
CASOS NORMAIS
LIMITES
ZEROS
NEGATIVOS
VALORES MÁXIMOS
DADOS INVÁLIDOS
ARQUIVO VAZIO
DUPLICIDADES
ERROS DB2
ERROS CICS

E principalmente:

garantir que você não consertou uma coisa quebrando três.

Esse fenômeno é conhecido tecnicamente como:

sexta-feira às 17h43.


📚 Documente o incidente

Encontramos:

CAUSA:
campo VALOR recebeu caractere inválido.

ORIGEM:
programa anterior gerou registro inconsistente.

IMPACTO:
JOB FATURA01 interrompido.

CORREÇÃO:
validação corrigida na origem.

PREVENÇÃO:
teste adicionado.

Isso vale muito mais do que:

PROBLEMA RESOLVIDO.

Daqui a três anos outro programador pode encontrar situação semelhante.

E descobrir que o Professor Pardal de 2026 deixou um mapa.


🐔 O melhor debugger não é quem conhece todos os ABENDs

É quem sabe fazer boas perguntas.

O QUE FALHOU?

ONDE?

QUANDO?

COM QUAL DADO?

SEMPRE ACONTECE?

QUAL FOI A ÚLTIMA EXECUÇÃO BOA?

O QUE MUDOU?

CONSEGUIMOS REPRODUZIR?

QUAL VARIÁVEL ESTAVA ERRADA?

QUEM ALTEROU ESSA VARIÁVEL?

DE ONDE VEIO O DADO?

Cada resposta reduz o espaço de busca.

Debugging é uma batalha contra possibilidades.

Começamos com:

QUALQUER COISA PODE ESTAR ERRADA

e terminamos com:

ESTE BYTE ESTÁ ERRADO.

Isso é lindo.


☕ Professor Pardal termina seu café

Depois de duas horas de investigação encontramos a causa.

Um arquivo recebido por um programa COBOL possuía um registro:

0000000000000012578

e outro:

00000000000000A2578

Um único caractere.

Um miserável:

A

No meio de milhões de registros.

Esse pequeno A atravessou sistemas.

Passou por arquivos.

Entrou no programa.

Chegou a um campo tratado como numérico.

Esperou pacientemente.

Então encontrou uma operação decimal.

E derrubou um JOB gigantesco.

Milhares de linhas COBOL.

Db2.

JES2.

z/OS.

Mainframe de milhões de dólares.

Equipe de operações.

Desenvolvedores.

DBAs.

War Room.

Gestores.

Todos derrotados por:

A

Professor Pardal olha para Lampadinha.

Lampadinha olha para o dump.

O operador pergunta:

— Então era o mainframe?

Pardal responde:

— Não.

— Era COBOL?

— Não.

— Db2?

— Não.

— CICS?

— Também não.

— Então o que era?

Ele aponta para o registro.

A

Silêncio.

O JOB é reprocessado.

IEF142I FATURA01 STEP030 - STEP WAS EXECUTED
IEF285I
MAXCC=0000

E mais uma vez o gigantesco dinossauro de silício volta a trabalhar como se absolutamente nada tivesse acontecido.


🦖 A moral da história

Depois de décadas trabalhando com software, aprendemos uma coisa desconfortável:

os bugs mais difíceis nem sempre são tecnicamente sofisticados.

Às vezes são apenas pequenos.

Escondidos.

Intermitentes.

Dependentes de dados.

Dependentes de sequência.

Dependentes de uma combinação que acontece uma vez a cada cinco milhões de registros.

Por isso ferramentas são importantes.

Mas método é mais importante.

Professor Pardal pode possuir a oficina inteira.

Lampadinha pode possuir inteligência artificial.

Você pode ter o melhor debugger disponível.

Mas no final alguém ainda precisa perguntar:

“O que aconteceu imediatamente antes disso?”

E continuar perguntando.

Até encontrar aquele miserável byte que resolveu transformar uma madrugada tranquila em uma War Room.


☕ Epílogo — Um Café no Bellacosa Mainframe

03:58.

Incidente encerrado.

Professor Pardal guarda suas ferramentas.

Lampadinha desliga a IA.

Operações fecha o chamado.

O gerente pergunta:

“Podemos considerar causa raiz identificada?”

Sim.

“Podemos evitar recorrência?”

Sim.

“Precisamos de reunião amanhã?”

...

Professor Pardal olha para o relógio.

Olha para o mainframe.

Olha para Lampadinha.

Lampadinha discretamente apaga a luz.

E ambos fogem de Patópolis antes que alguém consiga pronunciar:

“Post-Mortem.”

🐔🔧☕🦖

JOB DEBUGPARDAL — MAXCC=0000

E todos viveram felizes...

até o próximo S0C7.

https://eljefemidnightlunch.blogspot.com/2026/06/a-saga-de-vagner-bellacosa-no-reino-dos.html

DISPLAY e BUG TRAP as melhores maneiras de debugar um programa COBOL. Qual é a sua técnica? #ibm #mainframe #cobol #debug #trap #bug #returncode #maxcc #jcl #sdsf #job

 

quarta-feira, 24 de abril de 2024

WarGames Entra no CPD — O Dia em que o WOPR Deu S0C7, Joshua Pediu um Dump e o Programador COBOL Descobriu que ABEND Não Significa “Acabou o Mundo”

 

Bellacosa Mainframe e os abends em mainframe

☕ Um Café no Bellacosa Mainframe

WarGames Entra no CPD — O Dia em que o WOPR Deu S0C7, Joshua Pediu um Dump e o Programador COBOL Descobriu que ABEND Não Significa “Acabou o Mundo”

Ou: como S0C4, S0C7, SB37, S322, S806, dumps, JES2, JCL, datasets, storage, load libraries e um pouco de sangue-frio transformam “JOB ABENDED” de mensagem apocalíptica em pista de investigação — e por que a melhor maneira de vencer um ABEND talvez seja aprender a não jogar adivinhação


“Shall we play a game?”

A tela 3270 ficou silenciosa.

O programador COBOL Padawan tinha acabado de submeter seu primeiro JOB sozinho.

No canto superior da tela:

IKJ56250I JOB COBTST1(JOB01234) SUBMITTED

Ele sorriu.

— Funcionou.

Joshua, instalado misteriosamente em algum lugar entre uma LPAR de desenvolvimento, um terminal antigo e o NORAD, respondeu:

PROCESSING...

Alguns segundos depois:

IEF450I COBTST1 STEP01 - ABEND=S0C7

Silêncio.

O Padawan olhou para a tela.

Olhou para o café.

Olhou novamente para a tela.

— Destruí o mainframe?

Joshua respondeu:

WOULD YOU LIKE TO PLAY
GLOBAL THERMONUCLEAR WAR?

— Não, obrigado. Só queria executar um COBOL.

Bem-vindo ao universo dos ABENDs.

E antes que alguém aperte o botão vermelho, precisamos entender uma coisa fundamental:

ABEND não significa que o mainframe morreu.

Normalmente significa apenas:

um programa, step ou tarefa terminou de maneira anormal.

E isso muda completamente a investigação.



1. Primeiro contato — afinal, o que é ABEND?

ABEND é abreviação histórica de:

ABnormal END

Ou seja:

término anormal.

Em um processamento normal, imaginamos algo parecido com:

JOB
 |
 +-- STEP01
 |
 +-- STEP02
 |
 +-- STEP03
 |
 `-- FIM

Cada programa termina conforme esperado.

Por exemplo:

RETURN CODE = 0000

Mas algo pode acontecer durante a execução:

JOB
 |
 +-- STEP01   RC=0000
 |
 +-- STEP02   ABEND S0C7
 |
 X

O sistema interrompe aquele processamento.

A primeira coisa que o iniciante precisa aprender é não misturar três conceitos:

RETURN CODE
ABEND
SQLCODE

Eles podem aparecer no mesmo trabalho, mas não significam a mesma coisa.

Um RC=0004, por exemplo, normalmente indica que determinado programa terminou e devolveu um código.

Já:

S0C7

significa que houve uma exceção durante a execução.

E:

SQLCODE -811

é uma condição reportada pelo Db2.

São universos relacionados, mas distintos.



2. O detalhe que engana todo Padawan: é zero, não letra O

Observe:

S0C4
S0C7

O caractere depois do S é:

0

zero.

Não:

O

Portanto:

S0C7

e não:

SOC7

Essa pequena diferença já entregou muitos novatos aos Sith Lords do suporte.

Também encontramos códigos como:

S806
SB37
S322

O formato varia porque esses códigos representam diferentes System Completion Codes.



3. Quem realmente matou o JOB?

Em WarGames, o drama nasce porque todo mundo olha para uma tela e começa a imaginar imediatamente o pior cenário possível.

No mainframe acontece algo parecido.

O operador vê:

ABEND S0C7

O programador conclui:

— Problema no sistema operacional.

O sysprog responde:

— É seu COBOL.

O DBA fala:

— Não tem nada a ver com Db2.

O storage pergunta:

— Por que vocês estão me chamando?

Joshua observa silenciosamente.

O procedimento correto é muito menos cinematográfico:

1. identificar o JOB
2. identificar o STEP
3. identificar o ABEND
4. localizar as mensagens
5. consultar dump/log
6. identificar programa/instrução
7. verificar causa
8. corrigir
9. recompilar, se necessário
10. executar novamente

Isso é investigação.

Não adivinhação.


4. O primeiro jogo de Joshua — S0C7

Talvez seja o ABEND mais famoso entre programadores COBOL.

S0C7

Geralmente está associado a uma Data Exception.

Traduzindo para o mundo COBOL:

algum dado que deveria ser numérico não contém uma representação numérica válida para a operação executada.

Imagine:

01  WS-VALOR      PIC 9(05).

E por algum problema de arquivo, layout ou movimentação, a área contém algo incompatível.

Então executamos:

ADD 1 TO WS-VALOR

O processador tenta realizar uma operação decimal.

Só que os bytes armazenados não representam o número esperado.

Resultado possível:

S0C7

O clássico culpado

Considere:

01 WS-NUMERO PIC 9(5).

MOVE '12A45' TO WS-NUMERO.
ADD 1 TO WS-NUMERO.

Dependendo da representação e do contexto, temos material perfeito para uma exceção de dados quando aquela área for usada aritmeticamente.

O verdadeiro problema, entretanto, nem sempre está na linha que deu o ABEND.

Esse é um princípio crucial.

A instrução:

COMPUTE WS-TOTAL = WS-VALOR + WS-TAXA

pode apenas ser o lugar onde a corrupção foi descoberta.

A corrupção talvez tenha acontecido 500 linhas antes.


5. Packed decimal — onde o S0C7 encontra seu habitat favorito

No COBOL empresarial encontramos muito:

PIC S9(7)V99 COMP-3

Isso é packed decimal.

Os dígitos são armazenados compactados em nibbles.

Por exemplo, conceitualmente, os valores são codificados em hexadecimal em vez de armazenados simplesmente como caracteres ASCII/EBCDIC visíveis.

O último nibble normalmente contém o sinal.

Valores típicos de sinal incluem:

C = positivo
D = negativo
F = unsigned/positivo em determinados contextos

Se uma área COMP-3 recebe bytes inválidos e depois participa de uma operação decimal, temos forte candidato a:

S0C7

Imagine um layout errado:

Arquivo real:

01 REGISTRO-REAL.
   05 CODIGO       PIC X(05).
   05 VALOR        PIC S9(7)V99 COMP-3.

Seu programa acredita que seja:

01 REGISTRO-ERRADO.
   05 CODIGO       PIC X(06).
   05 VALOR        PIC S9(7)V99 COMP-3.

Um byte mudou de posição.

Agora você não está lendo VALOR.

Está lendo uma mistura de bytes.

Joshua pergunta:

“Would you like to play S0C7?”


6. Checklist Bellacosa para um S0C7

Quando aparecer:

S0C7

não saia alterando código aleatoriamente.

Investigue:

O campo é DISPLAY?
COMP?
COMP-3?

O layout do arquivo está correto?

O copybook é a versão correta?

Houve REDEFINES?

Existe MOVE entre campos incompatíveis?

O registro possui o comprimento esperado?

O programa inicializou todas as áreas?

Existe arquivo antigo sendo processado com layout novo?

O erro apareceu depois de alteração de copybook?

E uma pergunta particularmente poderosa:

Qual era o conteúdo hexadecimal do campo no momento do ABEND?

O dump pode responder isso.

Aqui começamos a perceber por que um dump não é lixo.

Ele é a fotografia da cena do crime.


7. Segundo jogo — S0C4

Agora Joshua resolve jogar com memória.

S0C4

Esse ABEND está geralmente ligado a problemas de acesso à memória, proteção ou endereçamento.

Em linguagem humana:

o programa tentou acessar uma área de storage que não deveria ou não poderia acessar daquela maneira.

A imagem apresentada resume isso como:

Protection / memory access error.

É uma boa simplificação para o iniciante.

Mas o universo real é mais profundo.

Um S0C4 pode surgir por diversas situações, incluindo erros de endereço, referências inválidas, subscripts incorretos e problemas relacionados ao uso de storage.


8. O array que atravessou a fronteira do NORAD

Considere:

01 WS-TABELA.
   05 WS-ITEM PIC X(10) OCCURS 10 TIMES.

01 WS-I PIC 99.

Agora:

MOVE 50 TO WS-I

DISPLAY WS-ITEM(WS-I)

Temos apenas:

1 até 10

mas estamos tentando acessar:

50

Dependendo do programa, compilação e circunstâncias, podemos acabar acessando storage além da estrutura esperada.

Esse tipo de erro é especialmente perigoso porque memória não respeita a nossa intenção.

O processador não pensa:

“Ah, Vagner queria provavelmente o elemento número 5.”

Ele usa o endereço calculado.

Se estiver errado, estará errado em velocidade de mainframe.


9. Subscript versus index

COBOL possui mecanismos de tabelas que o iniciante precisa compreender.

Por exemplo:

05 WS-CLIENTE OCCURS 100 TIMES
   INDEXED BY IDX-CLIENTE.

Podemos navegar com índice:

SET IDX-CLIENTE TO 1

ou utilizar subscripts em determinadas definições:

MOVE WS-CLIENTE(WS-I)

Erros nessa lógica podem produzir acesso a áreas inesperadas.

Uma proteção importante durante desenvolvimento é utilizar opções adequadas de compilação e runtime para ajudar a detectar referências fora dos limites.

Em ambientes Enterprise COBOL modernos, opções como verificação de limites podem transformar bugs misteriosos em diagnósticos muito melhores.

Ou seja:

debugabilidade também é uma decisão de compilação.


10. S0C4 não significa automaticamente “memória cheia”

Essa confusão merece destaque.

S0C4 não deve ser traduzido simplesmente como:

acabou memória.

Normalmente o raciocínio é mais próximo de:

ocorreu uma exceção relacionada ao acesso/proteção/endereço de storage.

É diferente de:

não há memória suficiente

Por isso precisamos ler as mensagens associadas e o dump.

O código do ABEND é uma pista.

Não é necessariamente o diagnóstico completo.


11. Terceiro jogo — SB37

Agora o míssil nuclear é substituído por algo aparentemente muito menos dramático:

um dataset.

O JOB escreve:

AAAA
BBBB
CCCC
...

E continua.

E continua.

Até o z/OS dizer:

SB37

Em termos simplificados:

o dataset ficou sem espaço disponível para continuar a alocação necessária.

É o equivalente mainframe daquele momento:

Disk full

Mas com detalhes importantes relacionados a datasets, volumes, extents e alocação.


12. SPACE no JCL — a pequena linha que pode derrubar o STEP

Observe:

//OUTFILE DD DSN=BELLACOSA.TESTE.OUT,
//            DISP=(NEW,CATLG,DELETE),
//            SPACE=(TRK,(10,5)),
//            UNIT=SYSDA

Simplificando:

10 tracks = alocação primária
 5 tracks = incrementos secundários

Quando o dataset precisa crescer, o sistema tenta obter espaço adicional.

Se não conseguir continuar expandindo adequadamente, podemos encontrar situações como:

SB37

Há outros ABENDs relacionados a espaço, como:

SD37
SE37

E eles não devem ser tratados como absolutamente equivalentes.

Cada um fornece pistas sobre o que aconteceu durante a tentativa de alocação/extensão.


13. O erro nem sempre é “aumente o SPACE”

Aqui mora uma armadilha maravilhosa.

O programador vê:

SB37

e faz:

SPACE=(CYL,(9999,9999))

Problema resolvido?

Talvez.

Ou talvez tenha escondido algo muito pior.

Imagine que seu programa deveria escrever:

100.000 registros

mas devido a um loop:

PERFORM UNTIL EOF
    WRITE REG-SAIDA
END-PERFORM

o EOF nunca muda.

O programa escreve eternamente.

O dataset cresce.

Até acabar espaço.

O sintoma é:

SB37

Mas a causa lógica é:

LOOP INFINITO

Joshua está aprendendo.

E agora está fabricando registros em velocidade industrial.


14. Quarto jogo — S322

Se existe um código perfeito para um crossover entre JCL e WarGames, é:

S322

Em termos gerais, ele indica que o STEP excedeu determinado limite de tempo de execução permitido.

A imagem resume:

Job exceeded time limit.

Para o iniciante funciona.

Tecnicamente é bom lembrar que o problema normalmente é associado ao step/processamento e seu limite de CPU/tempo aplicável, não necessariamente ao JOB inteiro da forma genérica sugerida pela frase.

Uma causa clássica?

Loop.

PERFORM UNTIL WS-FIM = 'S'
    CONTINUE
END-PERFORM

Se:

WS-FIM

jamais se tornar:

S

parabéns.

Você inventou o moto-perpétuo COBOL.

O sistema, menos otimista, eventualmente intervém.


15. TIME no JCL

Podemos encontrar parâmetros como:

//STEP01 EXEC PGM=MEUPGM,TIME=5

O significado exato deve ser interpretado conforme a sintaxe e contexto do JCL, mas o ponto é que limites de execução podem existir.

Então, diante de S322, pergunte:

O programa entrou em loop?

O volume processado aumentou?

Existe READ que não avança?

Existe PERFORM sem saída?

Um SQL está extremamente custoso?

Houve mudança no comportamento de I/O?

O limite configurado é simplesmente inadequado para o workload?

Não conclua imediatamente:

“Preciso aumentar TIME.”

É o equivalente a descobrir que o carro está com acelerador preso e resolver o problema instalando um tanque de combustível maior.


16. O clássico loop de arquivo

Observe esta beleza:

PERFORM UNTIL WS-EOF = 'S'

    IF WS-TIPO = 'A'
       PERFORM PROCESSA-A
    END-IF

END-PERFORM.

Cadê o:

READ ARQUIVO

?

Joshua responde:

INTERESTING GAME.
THE ONLY WINNING MOVE IS TO READ THE NEXT RECORD.

17. Quinto jogo — S806

A imagem mostra:

806
Load module not found

Para nosso treinamento, vamos escrever corretamente o código de sistema como:

S806

Esse é um dos mais didáticos para entender a relação entre:

JCL
programa
load module
load library
STEPLIB
JOBLIB
link-edit

Imagine:

//STEP01 EXEC PGM=BELL001

O sistema precisa localizar um módulo executável chamado:

BELL001

Mas ele não aparece nas bibliotecas onde a busca está sendo realizada.

Resultado possível:

S806

18. “Mas o source existe!”

Essa frase já ecoou em milhares de CPDs:

— O programa existe! Estou vendo o membro no PDS!

Sim.

Mas você pode estar olhando para:

BELLACOSA.COBOL.SOURCE(BELL001)

Isso é source.

O sistema precisa executar o load module/program object correspondente.

Conceitualmente:

SOURCE
   |
   v
COMPILER
   |
   v
OBJECT
   |
   v
LINK-EDIT / BINDER
   |
   v
LOAD MODULE / PROGRAM OBJECT

Executar COBOL não significa o z/OS abrir seu source e interpretar:

MOVE A TO B

O programa precisa ter passado pelo processo necessário para produzir algo executável.


19. STEPLIB — o mapa que Joshua perdeu

Imagine:

//STEP01 EXEC PGM=BELL001
//STEPLIB DD DSN=BELLACOSA.LOADLIB,DISP=SHR

Estamos indicando uma biblioteca onde o sistema poderá procurar o programa.

Agora imagine:

BELL001 está em:

BELLACOSA.LOAD.PROD

mas o JCL usa:

BELLACOSA.LOAD.TEST

Joshua procura.

Não encontra.

S806

Perguntas úteis:

O nome em PGM= está correto?

O módulo foi link-editado?

O binder terminou com sucesso?

O módulo está realmente nessa LOADLIB?

STEPLIB aponta para a biblioteca correta?

JOBLIB interfere na busca?

Existe diferença entre ambiente DEV, QA e PROD?

Uma nova versão foi compilada mas não implantada?

20. O grande mapa dos cinco ABENDs

Guarde esta associação inicial:

CódigoPense primeiro em
S0C4acesso/endereço/proteção de storage
S0C7dados numéricos inválidos / data exception
SB37problema de espaço/extensão de dataset
S322limite de execução/tempo excedido
S806programa/load module não localizado

Mas acrescente mentalmente:

“Pense primeiro em...”

e não:

“A causa obrigatoriamente é...”

Essa diferença separa troubleshooting de superstição.


21. O verdadeiro professor chama-se JES

Depois do ABEND, uma das primeiras paradas costuma ser a saída do JOB.

No universo z/OS, frequentemente estamos navegando por elementos como:

JES2
SDSF
JESMSGLG
JESJCL
JESYSMSG
SYSOUT
SYSPRINT
CEEDUMP
SYSUDUMP
SYSABEND

Nem todos aparecerão em todos os casos.

Mas isso cria uma regra:

Nunca investigue um ABEND olhando apenas para o código final.

Leia as mensagens próximas ao momento da falha.

Por exemplo:

IEF...
IGD...
IEC...
CEE...
IGZ...

Os prefixos das mensagens já podem indicar qual componente está conversando com você.

O z/OS é quase uma cidade onde cada repartição começa suas cartas com uma assinatura diferente.


22. SDSF — nossa sala de guerra

O Padawan abre o SDSF.

Entra no painel de jobs.

Localiza:

COBTST1

E começa a investigação.

Fluxo mental:

ST
 |
 +--> localizar JOB
       |
       +--> verificar RC / ABEND
             |
             +--> localizar STEP
                   |
                   +--> mensagens
                         |
                         +--> SYSOUT
                               |
                               +--> dump

A pergunta não é:

“Onde está escrito S0C7?”

A pergunta é:

“O que estava acontecendo imediatamente antes do S0C7?”


23. Procure o STEP, não apenas o JOB

Imagine:

//JOB01 JOB ...
//STEP10 EXEC PGM=PROGA
//STEP20 EXEC PGM=PROGB
//STEP30 EXEC PGM=PROGC

Resultado:

STEP10 RC=0000
STEP20 ABEND=S0C7
STEP30 FLUSH

Temos uma informação gigantesca:

PROGA provavelmente terminou
PROGB falhou
PROGC nem executou

Então não comece depurando PROGC.

Parece óbvio.

Sob pressão de produção às 02:37, deixa de ser.


24. Cond code e ABEND não são irmãos gêmeos

Outro conceito importante.

Um programa pode terminar:

RC=0000

Outro:

RC=0004

Outro:

RC=0008

Outro pode sofrer:

ABEND S0C7

Return codes são definidos/conduzidos pelo software conforme sua lógica e convenções.

ABENDs representam término anormal.

Por exemplo, COBOL pode fazer:

MOVE 8 TO RETURN-CODE
GOBACK

O programa terminou deliberadamente com RC 8.

Isso não é igual a sofrer uma exceção e acabar em S0C7.


25. E o misterioso Uxxxx?

Nem todo ABEND começa com S.

Você também poderá encontrar algo como:

U4038

O U remete a user abend.

Ou seja, o término foi solicitado por software/aplicação/runtime em determinada condição.

Um clássico em ambientes Language Environment pode envolver códigos dessa família associados a erros detectados durante execução.

Isso nos dá dois grandes mundos conceituais:

Sxxx = System completion code
Uxxxx = User completion code

Para o Padawan, essa distinção já vale ouro.


26. Dump — a autópsia do programa

Um dump pode parecer inicialmente uma espécie de pergaminho Sith:

PSW
GPR0
GPR1
GPR2
...
OFFSET
TRACEBACK
STORAGE
HEX
MODULE

O iniciante pensa:

— Preciso aprender hexadecimal, assembler e arquitetura z/Architecture inteira antes de corrigir meu COBOL?

Não.

Mas, conforme você evolui, aprender a ler informações de dump muda radicalmente sua capacidade de suporte.

Procure inicialmente:

Nome do programa
Código do ABEND
Offset
Statement
Entry point
Call chain
Variáveis relevantes
Mensagem do runtime

Compilação com informações adequadas de debug pode permitir uma correlação muito melhor entre:

OFFSET

e:

linha COBOL

Essa é uma das grandes vantagens de manter listings de compilação.


27. Nunca jogue fora o compile listing

O compile listing parece inútil enquanto tudo funciona.

Quando o programa cai em produção:

OFFSET +00001A72

de repente aquele listing vira o Santo Graal.

Dependendo das opções e tooling utilizados, ele pode ajudar a relacionar:

offset
paragraph
statement
generated code
data definitions

Por isso equipes maduras conservam artefatos apropriados das builds.

Não somente:

SOURCE.COBOL

Mas também aquilo que permite provar:

qual versão foi compilada, como foi compilada e qual executável foi gerado.

Isso é DevOps antes de DevOps receber esse nome.


28. Curiosidade Bellacosa — ABEND é quase uma filosofia operacional

Mainframes nasceram em um mundo em que jobs podiam processar volumes enormes sem alguém olhando continuamente para a tela.

Logo o sistema precisava dizer precisamente:

terminou?

Se sim:

como terminou?

E se algo deu errado:

por quê?

Por isso temos uma cultura inteira ao redor de:

completion codes
return codes
messages
logs
dumps

Cloud, Kubernetes e observabilidade moderna redescobriram ideias semelhantes com:

exit codes
logs
events
traces
metrics
crash dumps
health checks

O CPD de 1975 provavelmente reconheceria muita coisa em uma War Room de 2026.

Só perguntaria por que colocaram emojis no dashboard.


29. Método Bellacosa de sete perguntas

Quando um programa cair, faça estas perguntas nesta ordem:

1. Qual JOB falhou?

JOBNAME?
JOBID?

2. Qual STEP falhou?

STEP10?
STEP20?
PROCSTEP?

3. Qual programa estava rodando?

PGM=?

4. Qual foi o ABEND?

S0C7?
S0C4?
S806?
...

5. Que mensagens apareceram antes e depois?

Não leia apenas uma linha.

Contexto importa.

6. Qual foi a última alteração?

Pergunta brutalmente poderosa:

Novo source?
Novo copybook?
Novo arquivo?
Novo JCL?
Nova loadlib?
Novo volume de dados?
Nova versão do compilador?

7. Consigo reproduzir?

O problema reproduzível deixa de ser fantasma.

Vira experimento.


30. O jogo mais perigoso chama-se “tentar coisas”

Joshua apresenta:

S0C7

O programador altera:

REGION=0M

Não resolveu.

Aumenta SPACE.

Não resolveu.

Troca DISP.

Não resolveu.

Recompila.

Não resolveu.

Executa novamente.

Não resolveu.

Troca a STEPLIB.

Agora surge:

S806

Parabéns.

Transformamos um incidente em dois.

Troubleshooting profissional segue hipóteses:

EVIDÊNCIA
   ↓
HIPÓTESE
   ↓
TESTE
   ↓
RESULTADO
   ↓
CONCLUSÃO

Não:

ABEND
 ↓
PÂNICO
 ↓
ALTERA TUDO
 ↓
REZA

31. Easter egg — Joshua encontra o JCL

Joshua pergunta:

SHALL WE PLAY A GAME?

O operador responde:

//WARGAME JOB (NORAD),'JOSHUA',
//        CLASS=A,
//        MSGCLASS=X
//STEP01 EXEC PGM=WOPR
//STEPLIB DD DSN=NORAD.DEFENSE.LOAD,DISP=SHR
//INPUT   DD *
GLOBAL THERMONUCLEAR WAR
/*

JES2:

JOB SUBMITTED

Três segundos depois:

IEF450I WARGAME STEP01 - ABEND=S806

Operador:

— Graças a Deus esqueceram de instalar o load module.

Às vezes um S806 salva a humanidade.


32. O exercício do Padawan — provoque um erro controladamente

Em laboratório, entender falhas controladas é excelente treinamento.

Nunca faça isso em produção.

Crie programas simples destinados especificamente a estudar:

S0C7
limites de OCCURS
arquivo crescendo
loops
STEPLIB incorreta

A ideia não é memorizar cinco códigos.

É aprender a cadeia:

CÓDIGO
   ↓
COMPILAÇÃO
   ↓
LINK
   ↓
JCL
   ↓
EXECUÇÃO
   ↓
JES
   ↓
ABEND
   ↓
DIAGNÓSTICO

Quando você entende a cadeia, dezenas de códigos deixam de parecer mágicos.


33. Laboratório mental 1 — S0C7

Você tem:

01 WS-TOTAL PIC S9(7)V99 COMP-3.

O programa sofre:

S0C7

Pergunte:

Quem escreveu nessa área?

Foi MOVE?

Foi arquivo?

Foi Db2?

Foi outra estrutura?

Existe REDEFINES?

O copybook coincide com o registro físico?

Não olhe apenas para:

ADD WS-TOTAL TO ...

A instrução pode ser apenas a vítima que encontrou o cadáver.


34. Laboratório mental 2 — S0C4

Programa cai após:

MOVE WS-TABELA(WS-I) TO WS-SAIDA

Pergunte imediatamente:

Qual valor de WS-I?

Qual OCCURS?

Existe DEPENDING ON?

Existe subscript fora da faixa?

Alguma área foi sobrescrita?

Existe CALL utilizando parâmetros incorretos?

Interfaces entre programas são particularmente interessantes.

Se:

CALL 'PGM2' USING A B C

mas PGM2 interpreta parâmetros incompatíveis, podemos produzir estragos memoráveis.


35. Laboratório mental 3 — SB37

Dataset lotou.

Antes de simplesmente aumentar espaço, verifique:

Quantos registros eram esperados?

Quantos foram escritos?

LRECL?

RECFM?

SPACE?

Primário/secundário?

Volume disponível?

Extents?

Houve crescimento anormal?

Se ontem o arquivo tinha:

500 MB

e hoje tentou chegar a:

80 GB

não comece culpando o storage.

Pergunte por quê.


36. Laboratório mental 4 — S322

Pergunte:

Onde o programa estava?

Quantos registros processou?

Existe progresso no contador?

READ avança?

Cursor Db2 avança?

Laço tem condição de saída?

Foi aumento legítimo de workload?

Um contador de diagnóstico pode ajudar enormemente em desenvolvimento:

ADD 1 TO WS-CONTADOR

IF FUNCTION MOD(WS-CONTADOR 10000) = 0
   DISPLAY 'PROCESSADOS: ' WS-CONTADOR
END-IF

Não necessariamente colocaríamos exatamente isso em toda produção eternamente.

Mas como técnica de investigação, observar progresso é ouro.


37. Laboratório mental 5 — S806

Seu JCL:

//STEP01 EXEC PGM=ABC123

Cheque:

ABC123 existe?

Foi bindado/link-editado?

Está na biblioteca correta?

STEPLIB está certa?

O módulo tem esse nome?

Deploy ocorreu?

Existe alias?

Ambiente está apontando para QA ou DEV?

Um detalhe delicioso:

o source pode chamar-se:

PROGRAMA1

e o executável implantado possuir outro nome conforme processo de build.

Nunca presuma.

Verifique.


38. ABEND também ensina arquitetura

Esses cinco códigos parecem erros isolados.

Mas observe o que aprendemos:

S0C7

Ensina:

representação de dados
PIC
COMP-3
layouts
copybooks

S0C4

Ensina:

storage
endereçamento
arrays
CALL
memória

SB37

Ensina:

datasets
DASD
SPACE
extents
JCL

S322

Ensina:

CPU
loops
execução batch
limites
performance

S806

Ensina:

build
binder
load libraries
STEPLIB
execução

Ou seja:

estudar ABEND é estudar o próprio mainframe.


39. O erro moderno: pedir imediatamente à IA

Em 2026 temos outra personagem sentada na sala do WOPR.

O programador copia:

ABEND S0C7

para uma IA e pergunta:

“Corrija meu programa.”

A IA pode explicar brilhantemente as causas comuns.

Mas faltam informações.

Ela não viu:

dump
layout
input
listing
JCL
alteração recente
conteúdo hexadecimal

A pergunta melhor seria:

Meu STEP STEP20 executando programa FATU001
terminou com S0C7.

O dump aponta para o statement 1487.
A variável usada é WS-VALOR PIC S9(7)V99 COMP-3.
O valor veio do campo ARQ-VALOR de um copybook alterado ontem.

Quais hipóteses devo testar?

Agora existe contexto.

IA não elimina troubleshooting.

Ela pode acelerar troubleshooting bem feito.


40. Nunca coloque dados sensíveis do dump em qualquer IA pública

Aqui aparece nosso RACF imaginário.

Dumps podem conter:

nomes
contas
identificadores
dados financeiros
credenciais
tokens
dados pessoais
informações de infraestrutura

Portanto:

sanitizar dados faz parte do diagnóstico moderno.

Não copie um dump de produção inteiro para um serviço externo apenas porque quer descobrir um S0C7.

Joshua pode ser simpático.

Compliance talvez não seja.


41. O pequeno dicionário do sobrevivente

O Padawan deve reconhecer:

ABEND

Término anormal.

RC

Return Code.

CC

Condition Code, dependendo do contexto.

STEP

Unidade executável de um JOB.

SYSOUT

Saída gerada durante execução.

DUMP

Estado capturado para diagnóstico.

LOADLIB

Biblioteca contendo programas executáveis.

STEPLIB

DD utilizado para definir bibliotecas privadas de busca para aquele step.

JOBLIB

Biblioteca de busca aplicável aos steps do job dentro das regras pertinentes.

SPACE

Parâmetro relacionado à alocação de espaço do dataset.

OCCURS

Estrutura de repetição/tabela COBOL.

COMP-3

Representação decimal packed.


42. Uma rotina realista de incidente

Agora estamos às 03:00.

Produção.

JOB:

FATUR001

falhou.

Passo a passo:

1. Abrir SDSF

Encontrar:

FATUR001
2. Identificar step

Resultado:

STEP040
3. Identificar programa
FATU847
4. Identificar falha
S0C7
5. Ler mensagens

Buscar runtime/dump.

6. Identificar statement/offset

Suponha:

PARAGRAPH CALCULA-TOTAL
7. Identificar operandos
VALOR-BRUTO
TAXA
TOTAL
8. Inspecionar dados

Descobre-se que VALOR-BRUTO contém representação inválida.

9. Descobrir origem

Veio do arquivo produzido por STEP030.

10. Descobrir alteração

Copybook mudou ontem.

Agora temos causa provável.

Não:

“COBOL é antigo.”

Não:

“mainframe travou.”

Não:

“Db2 está estranho.”

Temos evidência.


43. O detalhe mais importante: encontre a causa raiz

Imagine que corrigimos um registro manualmente.

JOB roda.

Vitória?

Ainda não.

Precisamos perguntar:

Por que aquele registro ficou inválido?

Talvez:

programa produtor incorreto
copybook incompatível
deploy parcial
arquivo antigo
campo não inicializado
erro de interface
conversão equivocada

Caso contrário, amanhã:

S0C7

volta.

E Joshua pergunta novamente:

SHALL WE PLAY A GAME?

44. Prevenindo em vez de apenas corrigindo

O Jedi Mainframe não é aquele que conhece 500 ABEND codes de cabeça.

É aquele que cria sistemas que fornecem evidências boas.

Algumas práticas:

  • mantenha listings e artefatos de build;

  • versionamento de source e copybooks;

  • valide layouts;

  • controle deploy de load modules;

  • adote testes;

  • use opções de compilação apropriadas;

  • registre entradas críticas;

  • monitore crescimento de datasets;

  • monitore CPU e elapsed time;

  • trate arquivos e SQLCODE corretamente;

  • mantenha documentação de JCL;

  • preserve rastreabilidade entre source e executável.

A maior evolução acontece quando o sistema deixa de responder apenas:

DEU ERRO

e começa a responder:

ONDE
QUANDO
COM QUAL DADO
EM QUAL VERSÃO
DEPOIS DE QUAL ALTERAÇÃO

Isso é observabilidade.


45. Curiosidade — o mainframe já fazia “observabilidade” quando a palavra nem era moda

Hoje ouvimos:

logs
metrics
traces
telemetry
observability

O ecossistema mainframe possui há décadas uma enorme cultura de:

SMF
JES logs
system messages
dumps
accounting
performance data
audit records

Não são exatamente a mesma coisa das stacks modernas, claro.

Mas a filosofia é familiar:

um sistema crítico precisa deixar rastros suficientes para explicar o que aconteceu.

Os hipsters do Kubernetes descobriram o SYSOUT.

Só trocaram a fonte verde por Grafana.


46. A regra WarGames do ABEND

No final de WarGames, Joshua aprende algo fundamental examinando todas as possibilidades.

No mainframe, o programador também precisa parar de jogar:

“Qual alteração aleatória fará o JOB ficar verde?”

O jogo correto é:

“Qual evidência explica por que ele ficou vermelho?”

São filosofias completamente diferentes.

A primeira produz:

tentativa
erro
tentativa
erro
tentativa
milagre

A segunda produz:

observação
hipótese
teste
causa
correção
prevenção

47. Cheatsheet do Padawan

Quando aparecer:

S0C7

Pense:

DADO NUMÉRICO INVÁLIDO

Procure:

COMP-3
MOVE
arquivo
copybook
REDEFINES
layout
campo não inicializado

S0C4

Pense:

ACESSO/ENDEREÇO DE STORAGE

Procure:

OCCURS
subscript
index
CALL
ponteiros/referências
área sobrescrita

SB37

Pense:

ESPAÇO DO DATASET

Procure:

SPACE
volume
extents
crescimento
loop de escrita

S322

Pense:

TEMPO/EXECUÇÃO EXCESSIVA

Procure:

loop
READ
volume
SQL
CPU
condição de saída

S806

Pense:

PROGRAMA NÃO ENCONTRADO

Procure:

PGM=
STEPLIB
JOBLIB
LOADLIB
binder
deploy
nome do módulo

48. O mapa completo

Nossa aventura começou com cinco códigos.

Mas agora eles formam uma pequena arquitetura:

                    +------------------+
                    |       JOB        |
                    +--------+---------+
                             |
                             v
                    +------------------+
                    |       JCL        |
                    +--------+---------+
                             |
            +----------------+----------------+
            |                                 |
            v                                 v
       +---------+                       +-----------+
       | PROGRAM |                       | DATASETS  |
       +----+----+                       +-----+-----+
            |                                  |
            |                                  +--> SB37
            |
            +--> dados inválidos ------------> S0C7
            |
            +--> storage inválido -----------> S0C4
            |
            +--> loop/tempo -----------------> S322

      Antes de executar:
             |
             +--> módulo ausente ------------> S806

Esse desenho vale mais do que decorar uma tabela.

Ele mostra onde procurar.


49. Easter egg final — WOPR pede acesso à produção

Joshua:

ACCESS PRODUCTION?

RACF:

ICH408I USER(JOSHUA) GROUP(NORAD)
  INSUFFICIENT ACCESS AUTHORITY

Joshua:

A STRANGE GAME.
THE ONLY WINNING MOVE IS NOT TO DEPLOY ON FRIDAY.

O sysprog lentamente fecha o terminal.

O Padawan COBOL anota no caderno:

REGRA 1:
NUNCA CONFUNDIR S0C7 COM SOC7.

REGRA 2:
LER O JES.

REGRA 3:
OLHAR O STEP.

REGRA 4:
NÃO ALTERAR TUDO AO MESMO TEMPO.

REGRA 5:
DESCOBRIR CAUSA RAIZ.

REGRA 6:
NÃO DAR UPDATE EM PRODUÇÃO PARA JOSHUA.

Essa última não está no manual IBM.

Mas deveria.


Epílogo — a única jogada vencedora é aprender a ler a evidência

No início desta viagem, aqueles códigos pareciam mensagens criptografadas:

S0C4
S0C7
SB37
S322
S806

Agora podemos enxergá-los como pistas.

S0C4 pode nos levar ao mundo de storage e endereçamento.

S0C7 nos obriga a entender representação numérica, COMP-3, layouts e dados.

SB37 abre a porta para datasets, DASD e alocação.

S322 ensina sobre execução, loops, CPU e limites.

S806 revela toda a cadeia de compilação, binder, LOADLIB, STEPLIB e deploy.

E talvez esta seja a maior lição para quem começa em COBOL:

um ABEND não é apenas um erro.

É uma aula de arquitetura embrulhada em uma mensagem desagradável.

O programador iniciante olha:

JOB ABENDED

e pensa:

“Algo quebrou.”

O programador experiente olha a mesma mensagem e pergunta:

Qual JOB?
Qual STEP?
Qual programa?
Qual código?
Qual mensagem?
Qual offset?
Qual dado?
Qual versão?
O que mudou?

Essa mudança de mentalidade é gigantesca.

Porque mainframe não exige que você conheça todas as respostas.

Ele exige que você saiba onde procurar as perguntas certas.

Joshua finalmente apaga da tela:

GLOBAL THERMONUCLEAR WAR

e escreve:

S0C7 DIAGNOSTIC LAB

O Padawan toma um gole de café.

— Podemos jogar.

Joshua responde:

EXCELLENT.

PLEASE PROVIDE:
JOBNAME
STEPNAME
PROGRAM NAME
ABEND CODE
COMPILE LISTING
DUMP

O Padawan sorri.

Agora sim.

Não temos mais um jogador apertando botões aleatórios.

Temos um programador mainframe investigando uma falha.

E no Bellacosa Mainframe, essa é a diferença entre alguém que simplesmente executa COBOL...

...e alguém que começa realmente a entender z/OS.

☕ Fim de JOB.

IEF142I WARGAME STEP99 - STEP WAS EXECUTED - COND CODE 0000

A humanidade sobreviveu.

E melhor ainda:

o Padawan aprendeu a abrir o SDSF antes de culpar o mainframe.

Vagner Renato Bellacosa, IBM Champion e especialista em IBM Mainframe
IBM Z17 SYSTEM ONLINE
Sobre o autor

Vagner Renato Bellacosa

IBM Champion 2026 • Especialista em IBM Mainframe

Vagner Renato Bellacosa trabalha com IBM Mainframe desde 1988 , é IBM Champion e especialista em COBOL, CICS, Db2, z/OS e IBM Z. Compartilha experiências profissionais, conhecimento técnico, história da computação e práticas do universo mainframe para aproximar novas gerações das tecnologias que sustentam empresas, bancos e governos ao redor do mundo.

IBM Champion IBM Z COBOL CICS Db2 z/OS Mainframe desde 1988
GitHub LinkedIn
Inicializando conteúdo...