☕ 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 abend. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta abend. Mostrar todas as mensagens

sexta-feira, 28 de agosto de 2026

Westworld no CICS — Quando o Cowboy de Chapéu Preto Atravessou a Região, Igor Tentou Dar RETURN e Descobriu que o ABEND Ainda Tinha Balas

 

Bellacosa Mainframe e o westworld no CICS 

☕ Um Café no Bellacosa Mainframe

Westworld no CICS — Quando o Cowboy de Chapéu Preto Atravessou a Região, Igor Tentou Dar RETURN e Descobriu que o ABEND Ainda Tinha Balas

Ou: um jovem padawan COBOL entrou no parque de diversões do CICS, confundiu condição excepcional com fim do mundo, encontrou ASRA no saloon, AICA galopando em círculos e aprendeu que capturar o Pistoleiro não significa recuperar a transação


Prólogo — “Temos as férias perfeitas para você”

Em 1973, muito antes de alguém discutir inteligência artificial generativa no café da firma, Michael Crichton escreveu e dirigiu Westworld. O filme mostrava Delos, um parque de diversões para adultos formado por três mundos: o Velho Oeste, a Roma Antiga e a Europa medieval. Os visitantes pagavam para viver fantasias cercados por androides tão convincentes que pareciam humanos.

Tudo funcionava até deixar de funcionar.

Pequenas anomalias surgiam aqui e ali. Um robô recusava uma ordem. Uma cascavel mecânica atacava quando não deveria. Um cavaleiro ultrapassava os limites de segurança. Os técnicos percebiam que alguma coisa estava errada, mas ainda acreditavam que o problema cabia dentro dos painéis da sala de controle.

Então aparece o Pistoleiro, interpretado por Yul Brynner: roupa preta, passos metódicos, olhos artificiais e uma persistência que faria qualquer operador pedir um CEMT INQUIRE TASK. Aquilo que fora criado para perder duelos e divertir visitantes passa a perseguir Peter Martin como se tivesse recebido uma instrução impossível de cancelar.

O filme é uma metáfora quase perfeita para uma região CICS.

Delos é a região. Cada visitante é uma task. Os edifícios são recursos. Os anfitriões são programas. A sala subterrânea representa as equipes de operação. As regras do parque são as definições e controles do CICS. E o Cowboy de Chapéu Preto é o ABEND: ele pode surgir num programa profundo, atravessar níveis lógicos e continuar subindo até encontrar alguém preparado para recebê-lo.

Mas há uma diferença importante: no CICS, não basta atirar no mensageiro, apagar a mensagem da tela e dizer que o parque voltou ao normal. É preciso descobrir o que aconteceu com a unidade de trabalho, o que foi atualizado, o que precisa ser desfeito e se a transação ainda é confiável.

Bem-vindo a Westworld. Favor manter mãos, pés e COMMAREA dentro da transação.




1. Antes do tiroteio: transação, task e programa não são a mesma coisa

Para o programador COBOL iniciante, esses três conceitos às vezes parecem sinônimos. Não são.

A transação é identificada normalmente por um código de quatro caracteres, como TR01. Sua definição informa ao CICS qual programa inicial deve ser executado e contém atributos operacionais importantes.

A task é a instância daquela transação em execução. Se cinquenta usuários executarem TR01, teremos uma mesma definição de transação, mas várias tasks, cada qual com seu número, seu contexto e seus dados.

O programa é o código que executa dentro da task. Uma task pode passar por muitos programas:

TR01
  └── PROGA
        └── LINK PROGB
              └── LINK PROGC

Pense em Delos. “Westworld” é a atração anunciada no catálogo. A visita de Peter Martin é uma execução concreta. O saloon, a cadeia e o hotel são partes diferentes da experiência. Do mesmo modo, a transação é a entrada comercial; a task é a visita em andamento; e os programas são os ambientes atravessados.

Quando ocorre um ABEND, é a task que termina anormalmente. O programa que estava ativo pode ter provocado a falha, recebido a falha ou simplesmente estar no caminho dela.

Essa distinção muda o diagnóstico. Dizer “o programa caiu” é confortável, mas incompleto. O suporte precisa saber:

  • qual região CICS;

  • qual transação;

  • qual número da task;

  • qual programa estava executando;

  • qual nível lógico;

  • qual comando ou instrução falhou;

  • qual unidade de trabalho estava aberta;

  • quais recursos haviam sido alterados.

O código do ABEND é a placa pendurada no saloon. A cena do crime continua lá dentro.



2. Afinal, o que é um ABEND?

ABEND significa abnormal end, ou término anormal. Ele ocorre quando a task não pode — ou não deve — continuar seu processamento normal.

As causas incluem:

  • program check;

  • erro de lógica;

  • dado incompatível;

  • endereço de memória inválido;

  • condição excepcional CICS não tratada;

  • loop ou consumo excessivo de CPU;

  • arquivo fechado ou indisponível;

  • programa inexistente ou desabilitado;

  • falha de autorização;

  • timeout ou purge;

  • erro em comunicação;

  • EXEC CICS ABEND emitido deliberadamente pela aplicação;

  • problema de integridade em uma unidade de trabalho.

O iniciante costuma imaginar que todo ABEND é equivalente a uma explosão. Alguns são explosões. Outros são portas que a aplicação tentou abrir sem possuir a chave. Outros ainda são o próprio programa puxando o alarme porque percebeu que continuar seria perigoso.

Por isso, “eliminar todos os ABENDs” não é uma meta madura. Uma aplicação financeira pode preferir terminar anormalmente e executar backout a continuar depois de uma atualização incompleta.

O objetivo correto é:

evitar falhas previsíveis, tratar condições esperadas, preservar evidências nas falhas inesperadas e proteger a integridade dos dados.

No parque de Crichton, o problema não foi um único robô quebrar. O problema foi o sistema continuar vendendo normalidade enquanto os sinais mostravam que as garantias haviam desaparecido.



3. Condição excepcional não é automaticamente ABEND

Esta é a primeira grande curva da trilha.

Considere:

EXEC CICS READ
     FILE('CLIENTES')
     INTO(WS-CLIENTE)
     RIDFLD(WS-CHAVE)
END-EXEC.

Se a chave não existir, o CICS poderá retornar NOTFND. Isso é uma condição excepcional do comando READ, mas pode ser uma situação normal para o negócio: o usuário procurou um cliente que não está cadastrado.

O que acontecerá depende de como o programa foi preparado:

EstratégiaO que acontece
RESP e RESP2O programa recebe os códigos e decide
HANDLE CONDITIONO controle é desviado para uma rotina
IGNORE CONDITIONA ação padrão é suprimida para a condição
NOHANDLE no comandoO tratamento automático é suprimido naquele comando
Nenhuma proteçãoO CICS aplica a ação padrão, frequentemente um ABEND

Essa é a diferença entre um hóspede não encontrado no hotel e o Cowboy atravessando a recepção a tiros. Os dois são eventos fora do caminho feliz, mas não pertencem à mesma categoria.



4. RESP e RESP2: pergunte ao comando o que aconteceu

Para código COBOL estruturado, RESP e RESP2 geralmente tornam o fluxo mais claro:

01  WS-RESP   PIC S9(8) COMP VALUE ZERO.
01  WS-RESP2  PIC S9(8) COMP VALUE ZERO.

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

EVALUATE WS-RESP
    WHEN DFHRESP(NORMAL)
         PERFORM PROCESSAR-CLIENTE

    WHEN DFHRESP(NOTFND)
         PERFORM INFORMAR-CLIENTE-INEXISTENTE

    WHEN DFHRESP(NOTOPEN)
         PERFORM REGISTRAR-ERRO-TECNICO
         PERFORM ABORTAR-OPERACAO

    WHEN OTHER
         PERFORM REGISTRAR-RESPOSTA-INESPERADA
         PERFORM ABORTAR-OPERACAO
END-EVALUATE.

RESP fornece a condição principal. RESP2 oferece detalhe adicional cujo significado depende do comando e da resposta. Portanto, não existe um dicionário universal de RESP2: é preciso consultar a documentação do comando específico.

Também é preferível comparar com DFHRESP(NORMAL), DFHRESP(NOTFND) e outras constantes simbólicas, em vez de espalhar números mágicos pelo fonte. Daqui a dois anos, ninguém deveria precisar perguntar por que Igor escreveu IF WS-RESP = 13.

Dica de produção

Inicialize as variáveis, teste a resposta imediatamente depois do comando e preserve o contexto antes de executar outras operações CICS. O último comando pode alterar campos do EIB e deixar a equipe investigando o mensageiro em vez do atirador.



5. HANDLE CONDITION: coloque um xerife na esquina

HANDLE CONDITION associa condições CICS a rótulos:

EXEC CICS HANDLE CONDITION
     NOTFND(SEM-CLIENTE)
     NOTOPEN(ARQUIVO-FECHADO)
     IOERR(ERRO-DE-IO)
END-EXEC.

Quando uma dessas condições surgir em comando sujeito ao mecanismo, o controle poderá saltar para a rotina indicada.

É útil, especialmente em programas antigos ou em fluxos bem delimitados, mas exige cuidado. O tratamento fica ativo no nível lógico e pode capturar uma condição gerada longe do ponto onde foi declarado. Em um fonte grande, isso cria um roteiro de faroeste no qual o espectador precisa rever quarenta minutos para descobrir por que alguém entrou pela janela.

Para iniciantes, uma regra prática:

  • use RESP quando a decisão pertence à operação específica;

  • use HANDLE CONDITION quando um desvio controlado realmente melhora o desenho;

  • não misture estilos sem entender precedência e escopo;

  • nunca continue usando uma área de dados quando o comando que deveria preenchê-la falhou.



6. NOHANDLE: retirar o alarme não apaga a fumaça

NOHANDLE impede que os mecanismos automáticos de tratamento sejam aplicados àquele comando:

EXEC CICS READ
     FILE('CLIENTES')
     INTO(WS-CLIENTE)
     RIDFLD(WS-CHAVE)
     NOHANDLE
END-EXEC.

Isso não significa “ignore o erro e considere sucesso”.

Se a leitura falhar e o programa prosseguir:

PERFORM CALCULAR-LIMITE.

WS-CLIENTE pode conter zeros, dados antigos ou conteúdo inconsistente. O erro original era um NOTFND; o erro seguinte pode virar ASRA, cálculo incorreto ou, pior, uma decisão financeira válida sobre o cliente errado.

NOHANDLE sem verificação é Igor cobrindo os olhos do androide e anunciando que o Pistoleiro não consegue mais enxergá-lo.



7. HANDLE ABEND: a última barreira do parque

HANDLE ABEND instala uma saída de ABEND no nível lógico do programa:

EXEC CICS HANDLE ABEND
     PROGRAM('ERRPGM')
END-EXEC.

Em contextos compatíveis, também pode apontar para um rótulo:

EXEC CICS HANDLE ABEND
     LABEL(ROT-ABEND)
END-EXEC.

Ele não deve substituir o tratamento de condições previsíveis. Seu papel é receber falhas anormais, preservar informações e conduzir uma terminação ou recuperação controlada.

Imagine:

PROGA — saída A ativa
  └── LINK PROGB — saída B ativa
        └── LINK PROGC — nenhum handler
              └── ASRA

O CICS procura uma saída no nível atual. Não encontrando, sobe pelos níveis lógicos até localizar uma saída ativa. Se não houver nenhuma, a task termina anormalmente.

Existe apenas uma saída ativa por nível lógico. Declarar outra nesse mesmo nível desativa a anterior. Quando a saída recebe controle, o CICS a desativa antes de executar seu código, evitando reentrada infinita caso o próprio handler falhe.

É o Cowboy de Chapéu Preto atravessando Westworld, Medievalworld e Romanworld. Ele só para quando encontra alguém preparado — ou quando não resta mais parque.



8. CANCEL versus CANCEL: duas placas iguais em portas diferentes

O material que iniciou nossa conversa colocava “CANCEL versus HANDLE ABEND”, mas essa comparação pode induzir o iniciante ao erro.

EXEC CICS HANDLE ABEND
     CANCEL
END-EXEC.

Esse comando desativa a saída de ABEND do nível lógico atual. Ele não ordena, por si só, o encerramento imediato da task.

Já:

EXEC CICS ABEND
     CANCEL
END-EXEC.

é outra operação: cancela as saídas de ABEND em todos os níveis e força o término anormal.

ComandoSignificado
HANDLE ABEND PROGRAM(...)Ativa programa de tratamento
HANDLE ABEND LABEL(...)Ativa rotina local
HANDLE ABEND CANCELDesativa a saída do nível atual
HANDLE ABEND RESETReativa a saída após ela ter recebido controle
ABEND ABCODE('E001')Provoca ABEND definido pela aplicação
ABEND CANCELIgnora todas as saídas e termina a task

No CICS, contexto é munição. A mesma palavra, colocada em outro comando, produz outro resultado.



9. O erro mais perigoso: capturar o ABEND e dar RETURN

Chegamos à cena central.

Suponha uma transferência:

1. Debitar conta A
2. Creditar conta B
3. Gravar histórico
4. Enviar confirmação

O débito é realizado. Antes do crédito, o programa sofre ASRA. O handler registra “erro tratado” e executa:

EXEC CICS RETURN
END-EXEC.

Parece elegante. Não é.

Quando uma saída de ABEND termina com RETURN, o CICS pode devolver controle ao nível lógico superior como se o programa inferior tivesse retornado normalmente. Se a transação atualizou recursos recuperáveis e dependia do ABEND para provocar backout, o backout não ocorre; as alterações podem ser confirmadas.

Assim, uma rotina criada para proteger a aplicação pode transformar:

falha detectável + backout

em:

falha escondida + commit parcial

A própria IBM adverte que, quando é necessário preservar a integridade de recursos recuperáveis, a saída deve terminar com ABEND, não simplesmente retornar. Consulte How it works: Abend exit code.

Um desenho prudente:

ERRPGM-MAIN.

    PERFORM CAPTURAR-CONTEXTO
    PERFORM GRAVAR-LOG-SANITIZADO
    PERFORM NOTIFICAR-OPERACAO

    EXEC CICS ABEND
         ABCODE('E001')
    END-EXEC.

O handler pode registrar e notificar. Mas, se a unidade de trabalho precisa ser desfeita, deve permitir ou provocar o término anormal adequado.

Matar o alarme não mata o Cowboy.



10. Backout, commit e unidade de trabalho

Uma Unit of Work agrupa alterações que devem ser tratadas como uma unidade coerente.

UPDATE VSAM
   +
UPDATE Db2
   +
mensagem persistente
   =
trabalho ainda não confirmado

Quando ocorre um syncpoint bem-sucedido, as alterações recuperáveis são confirmadas. Quando uma task termina anormalmente em condições apropriadas, o CICS pode executar dynamic transaction backout.

Mas nem tudo é automaticamente recuperável:

  • um arquivo precisa estar definido e operado como recurso recuperável;

  • integrações externas podem não participar do mesmo escopo transacional;

  • uma chamada HTTP pode ter sido processada embora a resposta tenha se perdido;

  • uma mensagem pode pertencer a outra unidade de trabalho;

  • efeitos fora do CICS podem exigir compensação;

  • uma UOW distribuída pode ficar in-doubt.

Por isso, “deu ABEND, então tudo voltou” é uma crença perigosa.

Antes de repetir a transação, confirme:

  1. Houve backout?

  2. Algum syncpoint ocorreu antes da falha?

  3. O Db2 confirmou alterações?

  4. A mensagem MQ foi publicada?

  5. O sistema remoto recebeu a solicitação?

  6. Existe chave de idempotência?

  7. A primeira tentativa pode ter terminado com sucesso apesar da resposta perdida?

Retry sem conhecer o estado anterior é o equivalente operacional de colocar dois Pistoleiros no parque para resolver o problema do primeiro.



11. ASRA — o anfitrião perdeu o controle do próprio corpo

ASRA indica que a task terminou por causa de um program check.

Possíveis causas:

  • dado não numérico em operação decimal;

  • subscrito fora dos limites;

  • referência inválida à memória;

  • endereço corrompido;

  • storage já liberado;

  • incompatibilidade de parâmetros entre chamador e chamado;

  • copybooks divergentes;

  • comprimento incorreto;

  • corrupção de storage ocorrida antes;

  • erro em COBOL, PL/I, assembler ou componente chamado.

ASRA não é a causa-raiz; é a categoria. A investigação precisa localizar:

  • programa;

  • offset;

  • statement correspondente no compile listing;

  • PSW;

  • registradores;

  • traceback do Language Environment;

  • áreas de dados envolvidas;

  • versão exata do módulo carregado;

  • cadeia de LINK, XCTL ou chamadas.

Se o load module em execução não corresponde ao listing usado na investigação, o offset pode levar a uma linha inocente. É como analisar o mapa de Westworld da semana passada depois que alguém mudou o saloon de lugar.

A definição oficial pode ser consultada em IBM — ASRA.



12. AICA — o Cowboy que galopa em círculos

AICA indica uma possível runaway task: a task consumiu tempo de execução além do limite considerado aceitável.

Exemplo:

PERFORM UNTIL WS-FIM = 'S'
    ADD 1 TO WS-CONTADOR
END-PERFORM.

Se WS-FIM nunca mudar, temos um loop clássico.

Mas AICA não prova automaticamente “loop infinito”. Também pode sinalizar:

  • processamento legítimo grande demais para uma transação online;

  • algoritmo ineficiente;

  • ausência de pontos de suspensão;

  • volume anormal;

  • configuração inadequada do intervalo de runaway;

  • rotina batch colocada dentro do CICS;

  • instrumentação alterando o tempo;

  • laço que deveria avançar um cursor, mas não avança.

O CICS consegue detectar determinados loops comparando a execução com o intervalo configurado. Algumas chamadas que suspendem a task podem alterar esse comportamento. A investigação oficial está em IBM — AICA.

O conserto não é simplesmente aumentar o timeout. Primeiro determine se o trabalho pertence ao ambiente online, se pode ser paginado, dividido, agendado ou redesenhado.

Dar mais tempo a um loop infinito apenas permite que o Cowboy cavalgue mais longe.



13. AEI9 — a pista errada do infográfico

Aqui existe uma correção objetiva e importante.

O infográfico original apresentou AEI9 como algo relacionado a comando ou parâmetro inválido. AEI9 corresponde a MAPFAIL.

MAPFAIL costuma aparecer no BMS quando:

  • nenhum dado utilizável foi transmitido;

  • o usuário acionou uma tecla sem modificar campos;

  • a entrada chegou sem o formato esperado;

  • o programa esperava dados mapeados, mas recebeu entrada não formatada.

Já INVREQ, condição associada a requisição inválida, aparece como AEIP nessa família. AEIS corresponde a NOTOPEN.

CódigoCondição
AEI9MAPFAIL
AEIPINVREQ
AEISNOTOPEN
AEIMNOTFND
AEI0PGMIDERR

Essa diferença não é preciosismo. Se o operador procura parâmetro inválido diante de AEI9, perderá tempo examinando o comando errado quando deveria investigar entrada de terminal e BMS. Veja IBM — MAPFAIL.



14. EIB: o bolso do casaco do visitante

O EXEC Interface Block contém informações sobre o contexto da task:

  • EIBTRNID: identificador da transação;

  • EIBTASKN: número da task;

  • EIBTRMID: terminal;

  • EIBDATE e EIBTIME: data e hora;

  • EIBFN: função do último comando;

  • EIBRESP: resposta principal;

  • EIBRESP2: resposta secundária;

  • EIBCALEN: tamanho da COMMAREA recebida;

  • EIBAID: tecla de atenção recebida.

O detalhe crítico é “último comando”. Se o programa de erro executar vários comandos antes de preservar o EIB, poderá sobrescrever a evidência original.

MOVE EIBTRNID TO LOG-TRANSACAO
MOVE EIBTASKN TO LOG-TASK
MOVE EIBTRMID TO LOG-TERMINAL
MOVE EIBFN    TO LOG-FUNCAO
MOVE EIBRESP  TO LOG-RESP
MOVE EIBRESP2 TO LOG-RESP2.

Faça a captura cedo. Depois sanitize e registre.

Também não grave indiscriminadamente senhas, tokens, PINs, CVV, chaves, documentos completos ou COMMAREAs inteiras. Um log excelente para diagnóstico pode ser excelente também para um invasor.



15. Passo a passo do suporte de produção

Passo 1 — Identifique a visita

Colete região, transação, task, usuário, terminal ou canal, horário e correlation ID.

Passo 2 — Leia as mensagens associadas

O código de ABEND sozinho não conta a história. Procure mensagens DFH, logs da região, JES, Language Environment, Db2, MQ e demais componentes relacionados.

Passo 3 — Preserve dump e trace

Não suprima dumps por reflexo. Dump é caro quando existe em excesso, mas ausência de evidência também custa. A política deve equilibrar diagnóstico, volume, privacidade e recorrência.

Passo 4 — Classifique

É program check, runaway, condição EXEC não tratada, autorização, indisponibilidade, purge, timeout, falha distribuída ou ABEND criado pela aplicação?

Passo 5 — Localize o ponto

Para condição CICS, identifique comando, RESP, RESP2, parâmetros e recurso.

Para ASRA, use dump, offset, listing, PSW, registradores e traceback.

Passo 6 — Descubra o que mudou

  • deploy recente;

  • copybook alterado;

  • módulo sem NEWCOPY ou PHASEIN adequado;

  • definição de arquivo;

  • mudança RACF;

  • mapa BMS regenerado;

  • aumento de volume;

  • alteração no programa chamador;

  • erro restrito a uma região ou registro.

Passo 7 — Verifique integridade

Determine commit, backout, syncpoints, mensagens enviadas e efeitos externos.

Passo 8 — Só então decida

Corrigir, recuperar, compensar, reiniciar, repetir de modo idempotente ou escalar.



16. CEDF: visitar o parque com as luzes acesas

CEDF ajuda a observar interativamente o fluxo de comandos CICS. Ele pode mostrar entrada e saída de comandos, condições, opções e sequência de execução.

Mas não é máquina do tempo.

CEDF:

  • ajuda a reproduzir;

  • revela o fluxo;

  • permite examinar comandos;

  • não substitui dump;

  • pode alterar timing;

  • pode esconder problemas concorrentes;

  • exige extremo cuidado em produção.

A combinação forte é:

CEDF para compreender
+ dump para congelar a falha
+ trace para reconstruir a sequência
+ logs para correlacionar componentes
+ listing para localizar a instrução

Observar o Pistoleiro em câmera lenta ajuda. Ainda precisamos saber quem liberou a arma, qual trava falhou e se a sala de controle perdeu energia.



17. Curiosidades escondidas no parque

Easter egg 1 — o Pistoleiro já havia cavalgado antes

O visual de Yul Brynner em Westworld foi construído para lembrar Chris Adams, personagem interpretado por ele em The Magnificent Seven — Sete Homens e um Destino. Roupa escura, postura e presença criam uma referência cinematográfica deliberada. O robô parece uma cópia de outro cowboy, quase como um módulo recompilado a partir de um fonte antigo.

Easter egg 2 — visão digital antes de CGI virar rotina

O filme foi pioneiro no uso de processamento digital de imagem em longa-metragem para simular a visão pixelada do Pistoleiro. Décadas antes de dashboards coloridos e observabilidade distribuída, Crichton já nos colocava dentro do “sensor” da máquina.

Easter egg 3 — três mundos, três ambientes

Romanworld, Medievalworld e Westworld parecem ambientes separados, mas os defeitos atravessam fronteiras. É uma boa lembrança de que regiões, serviços e plataformas isolados no organograma podem compartilhar dependências invisíveis.

Easter egg 4 — Crichton repetiria a pergunta

Anos depois, Jurassic Park retomaria a ideia de uma atração tecnológica complexa, vendida como controlável, cuja segurança dependia de camadas frágeis e excesso de confiança corporativa.

Easter egg 5 — a frase de marketing

O slogan de Delos prometia férias extraordinárias. Depois do desastre, a promessa volta com ironia. Em TI, o equivalente é o slide que anuncia “zero incidentes” antes de a primeira evidência chegar ao console.

Informações históricas do filme podem ser consultadas na página oficial de Michael Crichton e no relato técnico da American Society of Cinematographers.



18. O mapa de decisão do jovem padawan

Quando um comando CICS não retorna NORMAL, pergunte:

  1. A condição é esperada pelo negócio?

  2. Ela pertence ao comando atual?

  3. Posso tratá-la localmente com RESP?

  4. Alguma área de dados deixou de ser preenchida?

  5. É seguro continuar?

  6. Houve atualização recuperável?

  7. Preciso provocar backout?

  8. Existe efeito fora da unidade de trabalho?

  9. Preciso de dump?

  10. Tenho evidência suficiente antes de emitir outro comando?

Quando ocorre ABEND:

  1. Preserve o código original.

  2. Capture o contexto.

  3. Não mascare falha de integridade.

  4. Não execute RETURN por hábito.

  5. Não repita a transação cegamente.

  6. Não confunda o código com a causa-raiz.

  7. Confirme o estado da UOW.

  8. Diferencie recuperação técnica de recuperação do negócio.



Epílogo — O Cowboy fecha o chamado?

No início de Westworld, os visitantes acreditam que o parque é seguro porque os androides foram programados para obedecer. A confiança nasce da regra escrita, não da evidência operacional.

No CICS, acontece algo parecido. O programa foi testado. O arquivo é recuperável. O handler existe. O log foi criado. A mensagem “erro tratado” apareceu. Tudo isso ajuda, mas nada disso prova que a transação terminou de forma íntegra.

HANDLE ABEND não é um colete à prova de balas. É uma saída program-level que oferece à aplicação uma última oportunidade de decidir o que fazer diante do término anormal.

Às vezes, a decisão será limpar recursos e continuar em um nível superior.

Às vezes, será converter uma falha técnica em resposta controlada.

Às vezes, será registrar o contexto e emitir outro ABEND para garantir o backout.

E muitas vezes, o ato mais profissional será admitir que o estado não é confiável e impedir que a task confirme uma meia verdade.

O programador iniciante aprende sintaxe:

EXEC CICS HANDLE ABEND
     PROGRAM('ERRPGM')
END-EXEC.

O profissional aprende responsabilidade:

Capturar uma falha não significa recuperar o negócio; remover o alarme não restaura a integridade; e nenhum RETURN deve atravessar a porta antes que alguém confira o que aconteceu com o commit e o backout.

Na última cena, o parque permanece silencioso. A sala de controle já não controla nada. Peter Martin sobrevive, mas olha ao redor sem saber exatamente onde terminou a fantasia e começou a falha.

No console do CICS, o Cowboy de Chapéu Preto deixa sua última mensagem:

ABEND CODE IS NOT ROOT CAUSE

Igor olha para o dump, tira lentamente o dedo do CANCEL e finalmente chama o programador que guardou o compile listing correto.

O boteco pode reabrir.

Mas somente depois do backout.



Referências essenciais



quarta-feira, 8 de julho de 2026

PERFORM Recursivo em COBOL: O Warning que Todo Padawan Ignora (Até o Job Estourar o TIME e o REGION)

 

Bellacosa e o perigo do perform recursivo

☕ Um Café no Bellacosa Mainframe

PERFORM Recursivo em COBOL: O Warning que Todo Padawan Ignora (Até o Job Estourar o TIME e o REGION)

"Recursão é uma ferramenta fantástica... exceto quando você tenta usá-la como estrutura de repetição dentro de um programa COBOL Batch."

Quem vem de Java, C#, Python ou C costuma achar natural escrever funções recursivas.

Quem cresceu no COBOL aprende rapidamente uma regra quase sagrada:

Nunca faça um PERFORM recursivo em um parágrafo ou seção.

Mas por quê?

Vamos abrir o capô do compilador.


Primeiro: o que é um PERFORM recursivo?

Imagine algo assim:

0000-PRINCIPAL.

    PERFORM 1000-PROCESSA

    STOP RUN.

1000-PROCESSA.

    DISPLAY "PROCESSANDO"

    PERFORM 1000-PROCESSA.

O programa chama...

...que chama...

...que chama...

...que chama novamente...

Nunca termina.


O warning da compilação

O Enterprise COBOL consegue detectar algumas formas óbvias de recursão.

Durante a compilação pode surgir mensagens semelhantes a:

IGYPSxxxx-W

Recursive PERFORM detected.

ou

Possible recursive PERFORM.

O compilador está dizendo:

"Existe um caminho onde este PERFORM pode executar novamente antes do anterior terminar."

Nem sempre é erro.

Mas quase sempre indica problema de projeto.


Por que isso é perigoso?

Porque PERFORM não foi criado para funcionar como chamada infinita de procedimentos.

Cada PERFORM precisa guardar informações como:

  • endereço de retorno

  • contexto de execução

  • pilha de controle

  • informações internas do runtime

A cada nova chamada tudo isso cresce.

PERFORM A
    ↓
PERFORM A
    ↓
PERFORM A
    ↓
PERFORM A
    ↓
PERFORM A

A pilha nunca é liberada.


O que acontece durante a execução?

Enquanto houver memória:

Stack

+----------------+
| retorno        |
+----------------+
| retorno        |
+----------------+
| retorno        |
+----------------+
| retorno        |
+----------------+
| retorno        |
+----------------+

Cada PERFORM adiciona um novo frame.

Quando acaba a pilha...

Boom.


O programa pode terminar com

Dependendo do ambiente:

  • S0C1

  • S0C4

  • S0CB

  • S878

  • S80A

Ou simplesmente:

ABEND

Tudo depende de onde ocorreu a falha.


O erro de TIME no JCL

Muito antes da memória acabar...

o Job pode morrer por tempo.

Exemplo:

//STEP1 EXEC PGM=MEUPROG,TIME=1

ou

TIME=1440

Mesmo com TIME=1440...

o programa nunca termina.

O JES percebe que o tempo máximo foi atingido.

Resultado:

S322

Ou mensagens semelhantes indicando limite de CPU excedido.

Não foi o COBOL.

Foi o JCL protegendo o sistema.


O erro de REGION

Outro clássico.

Cada PERFORM recursivo consome mais memória.

Em algum momento:

REGION=0M

não resolve.

Porque memória infinita não existe.

O resultado costuma ser:

S878

ou

S80A

Falta de armazenamento.


"Mas REGION=0M não é infinito?"

Não.

É apenas o máximo permitido pela instalação.

Existe limite de:

  • memória virtual

  • stack

  • storage abaixo da linha

  • storage acima da linha

  • política do sistema

Nada disso é infinito.


O maior problema: lógica

Suponha:

1000-ROTINA.

    IF WS-FIM = 'N'
       PERFORM 1000-ROTINA
    END-IF.

Quem altera:

WS-FIM

Se ninguém alterar...

Nunca haverá saída.

É um loop infinito disfarçado.


Por que não usar recursão em parágrafos e seções?

Porque COBOL foi projetado para outro paradigma.

A linguagem nasceu para processamento sequencial.

Ela possui comandos próprios para repetição.

Como:

PERFORM UNTIL
PERFORM VARYING
SEARCH
SEARCH ALL

Essas estruturas:

  • são previsíveis

  • ocupam pouca memória

  • facilitam depuração

  • têm melhor desempenho


"Mas COBOL suporta recursão."

Sim.

Desde o Enterprise COBOL moderno existe:

RECURSIVE PROGRAM-ID.

ou

PROGRAM-ID. MEUPROG RECURSIVE.

Isso significa que o programa pode chamar a si próprio.

Exemplo clássico:

  • árvore binária

  • parsing

  • algoritmos matemáticos

  • estruturas hierárquicas

Mesmo assim...

Não significa que seja recomendado para processamento batch tradicional.


A diferença importante

Errado

Parágrafo
↓

PERFORM

↓

Mesmo parágrafo

Recursão interna.

Difícil de manter.


Correto

Programa A

↓

CALL Programa A

↓

Novo contexto

↓

Retorna

Quando realmente houver necessidade de recursão.


Curiosidade

Os compiladores antigos praticamente desencorajavam qualquer tipo de recursão.

O foco sempre foi:

  • velocidade

  • previsibilidade

  • baixo consumo de memória

A maioria dos sistemas bancários jamais precisou de recursão.


Como um sênior resolveria?

Em vez disso:

PERFORM UNTIL WS-FIM = 'S'

    ...

END-PERFORM

ou

PERFORM VARYING IDX FROM 1 BY 1
        UNTIL IDX > TOTAL

Muito mais claro.

Muito mais rápido.

Muito mais seguro.


Boas práticas

✅ Prefira PERFORM UNTIL para laços controlados.

✅ Use PERFORM VARYING para contadores.

✅ Evite PERFORM chamando o próprio parágrafo.

✅ Revise IFs que nunca alteram a condição de saída.

✅ Analise os warnings do compilador; eles frequentemente apontam defeitos reais de lógica.

✅ Monitore consumo de CPU e storage no SDSF durante testes.

✅ Se precisar de recursão, utilize programas declarados RECURSIVE e valide cuidadosamente profundidade máxima e condição de parada.

✅ Sempre tenha uma condição de saída claramente identificável.


Dicas de depuração

Se um Job "não termina":

  1. Verifique se a CPU continua aumentando no SDSF.

  2. Procure PERFORMs que retornam ao mesmo parágrafo.

  3. Confirme se a variável de controle realmente muda.

  4. Ative SSRANGE em ambiente de teste para detectar erros relacionados a índices e referências inválidas.

  5. Gere um compile listing (LIST, MAP, XREF) para acompanhar o fluxo de chamadas.

  6. Revise mensagens do compilador; um warning ignorado hoje pode virar um ABEND amanhã.


Caminho para o Padawan COBOL

Antes de pensar em recursão, domine completamente:

  1. PERFORM

  2. PERFORM THRU

  3. PERFORM UNTIL

  4. PERFORM VARYING

  5. Estrutura de parágrafos e seções

  6. Escopo explícito (END-IF, END-PERFORM)

  7. Fluxo estruturado sem GO TO

  8. Subprogramas com CALL

  9. Programas RECURSIVE apenas quando o problema realmente exigir

Quando você entender por que o COBOL prefere estruturas iterativas, começará a enxergar o sistema como os arquitetos do IBM Z enxergam: programas previsíveis, eficientes e fáceis de manter. Em ambientes que processam milhões de transações por dia, previsibilidade vale muito mais do que elegância acadêmica.


terça-feira, 23 de junho de 2026

A Saga de Vagner Bellacosa no Reino dos Mainframes

 



☕💥 A Saga de Vagner Bellacosa no Reino dos Mainframes

Ou como um jovem padawan descobriu que COBOL dá mais XP que matar dragões

Bellacosa Mainframe e historias de velhos cpds em mainframe


Salve jovem padawan.

Pegue um café.

Se for diabético, pegue sem açúcar.

Se estiver em produção, pegue dois.

Hoje vou contar uma história.

Não a história de um herói tradicional.

Nada de capa.

Nada de espada mágica.

Nada de armadura lendária.

Nosso protagonista usa crachá corporativo, camisa social amassada, óculos cansados, carrega uma mochila cheia de apostilas IBM dos anos 90 e combate criaturas muito mais perigosas que dragões.

Ele atende pelo nome de Vagner Bellacosa.


O chamado da aventura

Toda jornada começa de maneira inocente.

Alguns encontram um anel.

Outros encontram uma espada cravada numa pedra.

Bellacosa encontrou...

Um terminal 3270.

Tela preta.

Letras verdes.

Cursor piscando.

Silêncio.

Nenhum botão.

Nenhum mouse.

Nenhum TikTok.

Nenhum React.

Nenhum Kubernetes.

Apenas um campo escrito:

LOGON ===>

Naquele instante existiam apenas duas possibilidades.

Primeira:

Desligar o computador e cursar gastronomia.

Segunda:

Digitar o usuário.

Ele digitou.

E nunca mais foi o mesmo.


O primeiro ABEND

Todo herói precisa sofrer.

Luke perdeu a mão.

Frodo quase perdeu a alma.

Bellacosa ganhou seu primeiro:

S0C7.

E descobriu algo curioso.

No Mainframe ninguém fala:

"Tem bug."

Todos falam:

— Deu ABEND.

ABEND parece nome de chefe final.

Você passa oito horas procurando.

Consulta dump.

Abre SYSOUT.

Lê JESMSGLG.

Olha o compile listing.

Chama o colega.

Chama outro colega.

Chama o especialista.

Chama um padre.

E no final descobre:

O campo numérico tinha espaço em branco.

Aí você aprende humildade.


Banco Real, a Terra Média dos Dinossauros Digitais

Existiu uma época gloriosa.

A época em que o Banco Real possuía milhares de programas.

Centenas de analistas.

Adabas.

Natural.

PLI.

JCL.

Control-M.

CICS.

VSAM.

RACF.

E um exército de desenvolvedores sobrevivendo a janelas batch.

Era uma civilização inteira.

Uma espécie de Atlântida tecnológica.

Enquanto a internet ainda fazia:

Piiiiiiiiiiiii....

Krrrttttt...

Biiiiiippp...

O Mainframe já processava milhões de registros.

Sem Kubernetes.

Sem Docker.

Sem palestra motivacional.

Sem coach dizendo:

"Escalone sua vida."

O Mainframe apenas respondia:

— JOB EXECUTADO RC=0000

E seguia trabalhando.


O homem que conversava com os programas Natural

Chegou então o Bug do Milênio.

O apocalipse anunciado.

Consultorias ficaram ricas.

Executivos ficaram nervosos.

Gerentes envelheceram.

Bellacosa teve uma ideia.

Criar um extrator.

Mas não qualquer extrator.

Um monstro.

Um PLI autorecursivo.

Um pequeno T-800 em formato de JCL.

Ele lia.

Interpretava.

Gerava JCL.

Enfileirava jobs.

Chamava a si próprio.

Criava novos filhos.

Extraía fontes.

Analisava objetos.

Preenchia bibliotecas.

E continuava trabalhando.

Sozinho.

Por 48 horas.

Consumindo CPU.

Consumindo spool.

Consumindo a sanidade do operador.

Quando terminou...

Meio milhão de objetos haviam sido catalogados.

Hoje chamaríamos isso de:

Pipeline de DevOps.

Na época chamava-se:

"Coisa do Bellacosa."


O Grande Inquisidor da DAI

Mas nenhum guerreiro evolui sem enfrentar a polícia secreta.

DAI.

Três letras capazes de congelar a alma.

Ser chamado pela DAI era equivalente a ouvir:

"Precisamos conversar."

Você imediatamente pensava:

Meu RACF vazou?

Compilei em produção?

Rodei a Loteca?

Usei a transação proibida?

Não.

Queriam apenas um relatório.

Um relatório pequeno.

Só precisava analisar milhares de logs.

Consultar usuários.

Cruzar tabelas.

Gerar dezenas de milhares de páginas.

Em 72 horas.

Sem errar.

Sem testar direito.

Sem segunda chance.

Bellacosa codificou.

Revisou.

Debugou com caneta.

Rezou.

Entregou.

Funcionou.

E descobriu uma lição importante.

Programador Mainframe não envelhece.

Ele acumula PTSD de produção.


O evangelista improvável

Décadas se passaram.

Muitos colegas migraram.

Viraram arquitetos.

Gerentes.

Executivos.

Consultores.

Alguns abriram startups.

Outros abriram adegas.

Bellacosa resolveu algo diferente.

Contar histórias.

Escrever artigos.

Criar newsletters.

Ensinar COBOL.

Explicar CICS.

Falar sobre VSAM.

Defender o velho gigante preto da IBM.

Transformar dump em entretenimento.

Transformar S0C4 em meme.

Transformar SYSUDUMP em literatura fantástica.

Porque descobriu algo curioso.

O Mainframe nunca foi apenas tecnologia.

Foi amizade.

Foi mentor.

Foi Roseli.

Foi Tokunaga.

Foi auditor assustador.

Foi operador bravo.

Foi colega salvando produção às três da manhã.

Foi café requentado.

Foi pizza fria.

Foi aprender que existem pessoas que realmente se emocionam ao ver um RC=0000.

E tudo bem.

Somos poucos.

Somos estranhos.

Somos os últimos guardiões do EBCDIC.


Epílogo

Hoje existem inteligências artificiais.

Agentes autônomos.

LLMs.

Clouds infinitas.

Quantum Computing.

Promessas de substituir COBOL.

Promessas de desligar Mainframe.

Promessas de reescrever tudo.

Promessas.

Muitas promessas.

Enquanto isso...

Em algum lugar do planeta...

Um CICS iniciado em 1998 continua processando cartões.

Um DB2 continua pagando aposentadorias.

Um VSAM continua guardando informações valiosas.

Um JCL continua rodando.

E um Bellacosa continua tomando café.

Escrevendo artigos.

Chamando leitores de padawans.

Contando histórias.

E lembrando a todos nós que talvez o verdadeiro legado do Mainframe nunca tenha sido o hardware.

Mas as pessoas malucas o suficiente para dedicar a vida inteira a fazê-lo funcionar.

E sinceramente...

Ainda bem que existem esses malucos.

Esse texto ficou bem próximo do tom clássico de "Histórias do Tiozão em Mainframe", misturando autobiografia, nostalgia, cultura pop, autoironia e reverência aos velhos guerreiros do z/OS. (DIO)

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.


domingo, 29 de março de 2026

🔥 VOCÊ USA z/OS TODO DIA… MAS NUNCA VIU ISSO AQUI! O “ESQUELETO INVISÍVEL” DO SYSTEM SERVICES QUE DECIDE SEU JOB VIVE OU MORRE 💀

 

Bellacosa Mainframe fala sobre z/OS system Service Structure

🔥 VOCÊ USA z/OS TODO DIA… MAS NUNCA VIU ISSO AQUI!
O “ESQUELETO INVISÍVEL” DO SYSTEM SERVICES QUE DECIDE SEU JOB VIVE OU MORRE 💀


Se você é dev COBOL raiz, daqueles que já tomou S0C7 no café da manhã e resolveu com dump na unha… segura essa:

👉 Existe uma camada no z/OS que você usa o tempo todo…
👉 Mas quase ninguém entende de verdade…
👉 E ela decide TUDO — do I/O ao ABEND.

Bem-vindo à z/OS System Services Structure.


🧠 O QUE É ESSA TAL DE STRUCTURE?

Pensa no z/OS como uma cidade:

  • Você (COBOL) → é o cidadão
  • JCL → é o pedido formal
  • JES2 → é o correio
  • E o System Services?
    👉 É a prefeitura, polícia, energia, trânsito e bombeiros… TUDO JUNTO.

É a estrutura que fornece serviços fundamentais como:

  • Gerenciamento de tarefas (Task Management)
  • Comunicação entre programas
  • Gerenciamento de memória
  • I/O (entrada/saída)
  • Tratamento de erros (ABENDs 👀)

⚙️ A ESTRUTURA NA PRÁTICA (SEM MIMIMI)

Aqui entra o coração técnico que muita gente ignora:

🔹 Control Blocks (os “documentos secretos”)

  • TCB (Task Control Block) → representa uma task
  • ASCB (Address Space Control Block) → representa o espaço de endereçamento
  • RB (Request Block) → encadeamento de chamadas

💡 Easter egg:
Se você já viu um dump com “TCB=…” e ignorou…
👉 você literalmente ignorou o “RG” da sua task.


🔹 Dispatcher (o maestro invisível)

  • Decide qual task roda
  • Gerencia prioridade
  • Alterna contexto

💬 Comentário Bellacosa-style:

“Se seu programa está ‘lento’, talvez o problema não seja o COBOL…
é o dispatcher dizendo: calma campeão, tem fila 😎”


🔹 SVC (Supervisor Call)

  • Porta de entrada para serviços do sistema
  • Tudo passa por aqui

👉 Quando seu COBOL faz I/O, quem resolve não é ele…
é o z/OS via SVC.

💡 Curiosidade:
SVC é tipo syscall no Linux… só que com terno e gravata 👔


💥 ONDE ISSO TE PEGA (E VOCÊ NEM SABIA)

Se liga nesses cenários:

  • ABEND estranho sem causa aparente
  • Programa “travando” sem loop
  • I/O lento do nada
  • Problemas intermitentes

👉 90% das vezes… está ligado ao System Services, não ao seu código.


🧩 COMO TUDO SE CONECTA (VISÃO RAIZ)

Fluxo simplificado:

  1. Seu COBOL executa
  2. Precisa de recurso (I/O, memória, etc)
  3. Chama um serviço via SVC
  4. System Services aciona control blocks
  5. Dispatcher decide quando executar
  6. Resultado volta pra sua aplicação

👉 Se algo falhar nesse caminho…
💥 ABEND na sua cara


🧠 GUIA DE ESTUDO (MODO GUERREIRO MAINFRAME)

Se você quer sair do nível “codador” e virar engenheiro de verdade, estude isso:

📚 Ordem sugerida:

  1. Address Spaces (ASID, ASCB)
  2. TCB e SRB
  3. Dispatcher e prioridades
  4. SVCs mais comuns
  5. Gerenciamento de memória (GETMAIN/FREEMAIN)
  6. Dump reading (IPCS)

🧪 Dica prática (ouro puro 💰)

Pegue um dump real e procure:

  • TCB atual
  • PSW
  • Última SVC chamada

👉 Isso é mais valioso que 10 cursos teóricos.


🕵️‍♂️ EASTER EGGS QUE POUCA GENTE SABE

💣 1. COBOL NÃO CONTROLA NADA
Quem controla é o z/OS. Seu programa só pede.


💣 2. ABEND NÃO É ERRO — É DECISÃO
O sistema decidiu parar você.
👉 E sempre tem motivo.


💣 3. TUDO É BLOCO ENCADEADO
z/OS é basicamente um grande “linked list corporativo” 😂


💣 4. PERFORMANCE NÃO É SÓ CÓDIGO
Pode ser prioridade de TCB, dispatching, ou contenção.


🚀 FRASE PRA LEVAR PRA VIDA (E PRO LINKEDIN 😎)

“Quem não entende System Services no z/OS…
não depura problema — só apaga incêndio.”


🔥 CONCLUSÃO (SEM ENROLAR)

Se você:

  • Só olha código COBOL → você vê a superfície
  • Entende System Services → você vê o sistema inteiro

👉 E é aqui que mora a diferença entre:

  • Programador
    vs
  • Especialista em Mainframe

sábado, 28 de março de 2026

🔥 SEU PROGRAMA ABENDOU… E AGORA?

 

Bellacosa Mainframe fala sobre dumps


🔥 SEU PROGRAMA ABENDOU… E AGORA?

O GUIA DEFINITIVO (E SEM MIMIMI) PARA DOMINAR DUMPS NO MAINFRAME 💥

Se você é dev COBOL e nunca ficou olhando um dump como se fosse hieróglifo egípcio… você ainda vai passar por isso 😄

Mas aqui vai a verdade estilo Bellacosa Mainframe:

👉 Dump não é problema… dump é RESPOSTA.
👉 Quem não sabe ler dump… fica refém de tentativa e erro.
👉 Quem domina dump… vira referência no time.

Bora transformar esse “bicho de 7 cabeças” em ferramenta de guerra ⚔️


💣 O QUE É UM DUMP (SEM ROMANCE)

Um dump é basicamente:

📌 Um snapshot da memória no momento do erro (ABEND)

Quando o programa explode (S0C7, S0C4, U4038…), o sistema salva:

  • Conteúdo de registradores
  • Memória ativa
  • Área de variáveis
  • Stack de execução
  • PSW (Program Status Word)

👉 É literalmente o “estado da cena do crime”.


🧨 TIPOS DE DUMP (E POR QUE ISSO IMPORTA)

🔹 1. SYSUDUMP (o clássico raiz)

  • Mais simples
  • Legível
  • Ideal para devs COBOL

👉 Se você está começando, é seu melhor amigo


🔹 2. SYSABEND (o detalhista hardcore)

  • Muito mais verboso
  • Inclui muito mais memória

👉 Útil… mas pode te afogar em informação


🔹 3. SYSMDUMP (nível CSI do mainframe)

  • Dump completo de memória
  • Usado para análise profunda / suporte IBM

👉 Aqui já é território de especialista ou suporte


📦 DDS DE DUMP (O QUE NÃO TE CONTAM DIREITO)

No JCL, o dump nasce aqui:

//SYSUDUMP DD SYSOUT=*
//SYSABEND DD SYSOUT=*
//SYSMDUMP DD SYSOUT=*

💡 Dica Bellacosa:

  • Nunca coloque os 3 juntos sem motivo
  • Pode gerar dump gigante e travar spool

👉 Escolha com estratégia, não no desespero


🧠 COMO LER UM DUMP (O JEITO CERTO)

Aqui é onde separa dev comum de dev ninja 🥷

🔍 1. Comece pelo ABEND CODE

Exemplos clássicos:

  • S0C7 → erro de dados (numérico inválido)
  • S0C4 → violação de memória
  • S0C1 → instrução inválida

👉 80% dos casos você resolve só entendendo isso


🧭 2. Vá direto no PSW

O PSW mostra:

  • Endereço da instrução que falhou

👉 Esse endereço é o “X marca o tesouro” 🏴‍☠️


📍 3. Localize o OFFSET

Você vai ver algo assim:

OFFSET = 00001A2C

Agora:

👉 Procure no listing do compilador
👉 Encontre a linha correspondente

💡 Easter egg:
Se você compila com LIST, MAP, OFFSET… sua vida muda completamente


🧩 4. Analise os REGISTERS

Especial atenção para:

  • R14 → retorno
  • R15 → entrada
  • R13 → área de trabalho

👉 Isso ajuda a entender o fluxo do programa


🔎 5. Veja o conteúdo das variáveis

No dump você verá HEX + EBCDIC:

F1F2F3F4 = 1234

👉 Aqui você encontra:

  • Campo numérico com lixo
  • Campo alfanumérico corrompido
  • Dados desalinhados

⚡ EXEMPLO REAL (RAIZ)

Erro clássico:

MOVE WS-TEXTO TO WS-NUMERO

Se WS-TEXTO tiver:

'ABC'

💥 Resultado:

S0C7

👉 Dump vai mostrar valor inválido no campo numérico


🧠 COMO SER RÁPIDO (MODO ELITE)

🚀 Regra de ouro:

“Não leia dump inteiro. Faça ele te responder.”

Checklist prático:

  1. ABEND code
  2. PSW address
  3. OFFSET
  4. Linha no listing
  5. Variável envolvida

👉 Pronto. Resolve 90% dos casos.


🧪 DICAS AVANÇADAS (OURO PURO)

💡 Compile assim sempre:

SSRANGE, LIST, MAP, OFFSET
  • SSRANGE → pega erro de índice
  • MAP → mostra variáveis
  • OFFSET → conecta dump com código

💡 Use CEEDUMP (quando tiver LE)

Se seu ambiente usa Language Environment:

👉 você ganha dump mais amigável


💡 Procure por "LAST EXECUTED STATEMENT"

Alguns dumps mostram isso direto
👉 economiza MUITO tempo


💡 Cuidado com redefines

👉 80% dos dumps estranhos vêm daqui


🕵️ CURIOSIDADES (EASTER EGGS MAINFRAME)

  • O termo “dump” vem literalmente de “despejar memória”
  • Dumps existem desde os anos 60 (sim, mais velhos que muita linguagem moderna)
  • Em ambientes críticos, dumps são analisados automaticamente por ferramentas de IA (sim, já estamos aí 🤯)

💬 COMENTÁRIO ESTILO BELLA

Se você ainda resolve erro com:

👉 DISPLAY pra todo lado
👉 Teste na tentativa
👉 “Ah, deve ser isso aqui…”

Você está perdendo tempo de vida.


🏁 CONCLUSÃO

Dump não é inimigo.

👉 Dump é o debugger raiz do mainframe.
👉 Dump é a verdade nua e crua.
👉 Dump é onde o COBOL fala com você.

E quando você aprende a ouvir…

💥 Você para de apagar incêndio e começa a dominar o ambiente.

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...