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

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



quinta-feira, 25 de dezembro de 2025

💥 SEU CICS NÃO QUEBROU — VOCÊ QUE NÃO ENTENDEU OS SINAIS

 

Bellacosa Mainframe solucionando problemas no CICS

💥 SEU CICS NÃO QUEBROU — VOCÊ QUE NÃO ENTENDEU OS SINAIS

O guia definitivo de troubleshooting CICS para dev COBOL sênior


Se você trabalha há anos com COBOL no CICS, já percebeu uma verdade incômoda:

CICS quase nunca “quebra do nada”. Ele avisa. Sempre.

O problema é que esses avisos vêm em forma de:

  • mensagens crípticas
  • sintomas indiretos
  • comportamento estranho

E aqui nasce a diferença entre:
👉 quem reage
👉 e quem diagnostica


🧠 ORIGEM: POR QUE CICS É ASSIM?

CICS nasceu nos anos 60/70 com um objetivo claro:

Alta disponibilidade + consistência transacional

Isso significa:

  • Não pode “tentar de novo e ver no que dá”
  • Não pode perder dados
  • Não pode assumir comportamento implícito

👉 Por isso:

💥 Se algo falha, ele PARA e registra — não improvisa


💣 FUNDAMENTO: SINTOMA ≠ CAUSA

Esse é o maior erro até de dev experiente.


🎯 Exemplo clássico:

Usuário:

“Sistema travou”


Possíveis causas:

  • Lock no IBM Db2
  • Loop de programa
  • Espera por recurso
  • Fila congestionada no IBM MQ

💡 Tradução:

O sintoma é genérico — o padrão é específico


🔍 O MAPA MENTAL DO TROUBLESHOOTING

Se você guardar só isso, já sobe de nível:

SintomaDiagnóstico provável
CPU altaLoop
CPU baixa + paradoWait
DFHACxxxxAbend
DFHSMxxxxStorage violation
IXGWRITELog problem
LentidãoPerformance

💥 OS 4 GRANDES CENÁRIOS (VIDA REAL)


🔁 1. LOOP — O DEVORADOR DE CPU

Sintomas:

  • CPU 100%
  • Sistema “busy”
  • Tasks não avançam

Causa comum:

PERFORM UNTIL WS-FIM = 'S'
* nunca muda WS-FIM 😈
END-PERFORM

💡 Easter egg 😏

AICA (abend de loop) é basicamente o CICS dizendo:
“chega, já deu…”



⏳ 2. WAIT — O SILÊNCIO PERIGOSO

Sintomas:

  • Sistema parado
  • CPU livre
  • Usuários esperando

Causa comum:

  • Lock no DB2
  • Arquivo VSAM ocupado

💡 Insight de produção:

WAIT não é erro — é dependência



💣 3. ABEND — O GRITO DO PROGRAMA

Clássicos:

CódigoSignificado
ASRAerro de programa
AEI0erro DB2
AEY9programa não encontrado

Exemplo real:

DFHAC2206 TRANS PAY1 ABEND ASRA

💡 Tradução:

  • Seu COBOL falhou
  • E deixou rastro


💥 4. STORAGE VIOLATION — O CAOS

DFHSM0102 Storage violation

👉 Isso significa:

Um programa sobrescreveu memória de outro


💡 Curiosidade histórica:
Isso vem da época onde controle de memória era mais “manual”
— e ainda hoje pode acontecer com ponteiros mal usados



🐢 PERFORMANCE — O INIMIGO INVISÍVEL

Performance ruim não derruba sistema…

👉 mas derruba o negócio


Sintomas:

  • Transações lentas
  • “CICS under stress”
  • Fila interna crescendo

Causas reais:

  • SQL ruim no DB2
  • MQ congestionado
  • Código ineficiente

💡 Easter egg 😏

“Está lento” quase nunca é CICS… quase sempre é SQL



🧾 LOG — A MEMÓRIA DO CICS

O CICS usa o MVS logger para armazenar:

  • System log
  • Forward recovery
  • Journals

👉 Se isso falhar:

IXGWRITE error

💥 Problema sério:

  • Sem log → sem recovery
  • Sem recovery → risco total

💡 Frase forte:

“Sem log, o CICS esquece o que aconteceu”



🔌 EXCI E COMUNICAÇÃO — OS FALSOS CULPADOS

Muitas vezes o erro NÃO está no CICS.


EXCI:

  • Batch chamando CICS
  • Integração interna

Comunicação:

  • TCP/IP
  • MRO
  • Sysplex

💡 Insight de campo:

Se parece problema de aplicação… desconfie da rede 😈



🧠 O PAPEL DO OPERADOR (E DO DEV ESPERTO)

Operador:

  • Identifica
  • Coleta
  • Escala

Dev sênior (você 😏):

  • Interpreta
  • Correlaciona
  • Resolve rápido

👉 Se o operador te entrega:

  • Transação
  • Hora
  • Mensagem

💥 Você já tem 70% do diagnóstico



🚀 PASSO A PASSO DE TROUBLESHOOTING (REAL)

🔍 1. Identifique o sintoma

  • CPU?
  • Espera?
  • Erro?

📊 2. Classifique

  • Loop
  • Wait
  • Abend
  • Performance

🧾 3. Leia a mensagem

👉 CICS SEMPRE fala o que aconteceu


🔎 4. Correlacione

  • DB2?
  • MQ?
  • VSAM?

⚙️ 5. Aja ou escale

  • Corrigir código
  • Ajustar recurso
  • Envolver sysprog


💣 CENÁRIO REAL (ESTILO BANCO)

Situação:

Sistema lento, sem erro


Dev iniciante:

“CICS está ruim”


Dev sênior:

  • Verifica tempo de resposta
  • Identifica SQL pesado
  • Ajusta query

🔥 Resultado:
Sistema normal



🧠 INSIGHT FINAL (NÍVEL EXPERT)

“CICS não falha em silêncio — ele deixa pistas.
Quem sabe ler, resolve rápido.
Quem não sabe… reinicia.”


🔥 CONCLUSÃO

Você não precisa decorar comandos.
Você precisa reconhecer padrões.


💥 Se você entendeu esse artigo, você já sabe:

✔ Diferenciar LOOP vs WAIT
✔ Ler mensagens DFH
✔ Entender abends
✔ Pensar como operador e dev


🚀 FRASE FINAL

“No mundo CICS, o problema nunca está escondido —
ele está escrito… você só precisa saber ler.”

 

terça-feira, 27 de maio de 2014

☕🔥 ABEND S0CB — O “DIVISOR IMPOSSÍVEL” DO MAINFRAME

 

Bellacosa Mainframe e o abend s0cb

☕🔥 ABEND S0CB — O “DIVISOR IMPOSSÍVEL” DO MAINFRAME

Quando o IBM Z Diz:

“VOCÊ TENTOU FAZER UMA CONTA QUE DESAFIA A MATEMÁTICA.”

Se existe um ABEND que faz o Junior Padawan perceber que:

até a matemática pode explodir no z/OS…

é o lendário:

🚨 S0CB

E normalmente ele aparece assim:

SYSTEM COMPLETION CODE=0CB

ou:

DECIMAL DIVIDE EXCEPTION

ou ainda:

FIXED-POINT DIVIDE EXCEPTION

E então nasce o desespero:

“O COBOL desaprendeu matemática?”
“O divisor virou entidade cósmica?”
“O COMP-3 entrou em colapso?”
“Eu dividi por zero?”
“COMPUTE virou arma nuclear?”

☕ Respira.

Porque o S0CB é um dos ABENDs MAIS CLÁSSICOS da aritmética IBM Z.

E um dos mais importantes para entender:

divisão decimal

overflow matemático

divide by zero

packed decimal

COMP-3

hardware arithmetic

dumps matemáticos


🔥 O QUE É O S0CB?

O S0CB é um:

🚨 DIVIDE EXCEPTION

Traduzindo:

A CPU IBM Z DETECTOU UMA OPERAÇÃO DE DIVISÃO INVÁLIDA.


☕ O GRANDE SEGREDO

O S0CB NÃO nasce no COBOL.

Ele nasce:

no hardware decimal do IBM Z.


🔥 O MOMENTO EXATO

Fluxo:

COMPUTE/DIVIDE
 ↓
COBOL gera instrução máquina
 ↓
CPU executa divisão
 ↓
Resultado inválido
 ↓
S0CB

☕ ANALOGIA BELLACOSA MAINFRAME

Imagine uma calculadora gigante bancária.

Você digita:

100 / 0

A calculadora olha para você em silêncio…

e explode dramaticamente.

Isso é:

☠️ S0CB


🔥 O MAIOR VILÃO

🚨 DIVISÃO POR ZERO

O rei absoluto do S0CB.


☕ EXEMPLO COBOL

COMPUTE WS-RESULT = WS-TOTAL / WS-QTD

Mas:

WS-QTD = ZERO

Resultado:

💥 S0CB


🔥 O “ZERO FANTASMA”

O mais traiçoeiro.


☕ EXEMPLO

MOVE SPACES TO WS-QTD

Depois:

COMPUTE WS-MEDIA = WS-TOTAL / WS-QTD

Dependendo do conteúdo:

☠️ desastre matemático.


🔥 O S0CB E O COMP-3

Agora entramos na matemática obscura do mainframe.


☕ EXEMPLO

PIC S9(7)V99 COMP-3

Packed decimal inválido pode causar:

divisão impossível.


🔥 O OVERFLOW MATEMÁTICO

Outro clássico.


☕ EXEMPLO

Resultado da divisão excede capacidade do campo.

01 WS-RESULT PIC 9(02).

Mas cálculo produz:

999999

CPU entra em sofrimento existencial.

Resultado:

💥 S0CB


🔥 O S0CB E O COMPUTE

Junior acha:

COMPUTE é inocente.

Não.

COMPUTE pode gerar:

  • DIVIDE

  • MULTIPLY

  • decimal arithmetic

  • overflow


☕ EXEMPLO CLÁSSICO

COMPUTE WS-PERC =
   (WS-VALOR * 100) / WS-TOTAL

Mas:

WS-TOTAL = 0

Resultado:

☠️ S0CB


🔥 O S0CB E O “ON SIZE ERROR”

Aqui nasce o conhecimento Jedi.


☕ EXEMPLO

DIVIDE A BY B
   GIVING C
   ON SIZE ERROR
      DISPLAY 'ERRO'
END-DIVIDE

Isso pode evitar alguns colapsos matemáticos.


🔥 MAS CUIDADO

Nem todo S0CB é tratado elegantemente.

Dependendo:

  • do runtime

  • do compilador

  • do tipo decimal

  • da instrução gerada

o ABEND ainda pode ocorrer.


☕ O S0CB E O ASRA

No CICS geralmente aparece como:

🚨 ASRA + S0CB

Porque o CICS intercepta a exceção matemática.


🔥 O S0CB E O DB2

Outro cenário clássico.

Valor vindo do DB2:

NULL
ZERO
DADO INVÁLIDO

Programa assume divisor válido.

Boom:

💥 S0CB


☕ O S0CB E O ARQUIVO

Campo numérico chega:

zerado

Mas ninguém validou.

Agora:

DIVIDE WS-QTD INTO WS-TOTAL

Resultado:

☠️ desastre financeiro.


🔥 O S0CB FANTASMA

O mais cruel.

Erro nasce MUITO antes.


☕ EXEMPLO

Linha 100:

MOVE ZERO TO WS-QTD

Linha 9000:

COMPUTE WS-MEDIA =
   WS-TOTAL / WS-QTD

Explosão distante da origem.


🔥 COMO INVESTIGAR O S0CB PASSO A PASSO


✅ PASSO 1 — IDENTIFIQUE O OFFSET

Exemplo:

PSW AT TIME OF ERROR
OFFSET X'01FA'

✅ PASSO 2 — PEGUE O LISTING COBOL

Cruze offset com:

  • compile listing

  • SYSADATA

  • Abend-AID

  • Fault Analyzer


✅ PASSO 3 — IDENTIFIQUE A DIVISÃO

Exemplo:

DIVIDE WS-A BY WS-B

ou:

COMPUTE WS-C = WS-A / WS-B

✅ PASSO 4 — INSPECIONE O DIVISOR

Pergunta sagrada:

“ELE ESTAVA ZERO?”


✅ PASSO 5 — ANALISE O STORAGE

Veja:

  • packed decimal

  • campos COMP-3

  • conteúdo hexadecimal

  • overflow


🔥 O DUMP DO S0CB

Aqui mora a matemática Jedi.

Veteranos analisam:

  • PSW

  • registers

  • decimal instructions

  • packed fields

  • operandos reais


☕ O PSW

Mostra:

ONDE A MATEMÁTICA MORREU.


🔥 O HEXADECIMAL IMPORTA

Exemplo válido:

F0F1F2

Número correto.


☕ EXEMPLO SUSPEITO

404040

Spaces em campo numérico.

Agora a divisão entra no reino do caos.


🔥 O S0CB E O “SOC7 DISFARÇADO”

Às vezes o problema real é:

dado inválido.

Mas explode durante divisão.

Veteranos investigam ambos:

  • S0CB

  • S0C7


☕ O MAIOR ERRO DOS JUNIORS

Corrigir apenas:

IF divisor = 0

sem entender:

POR QUE o divisor virou zero.


🔥 COMO EVITAR S0CB


✅ Validar divisor


✅ Usar ON SIZE ERROR


✅ Validar dados externos


✅ Revisar COMP-3


✅ Tratar NULL/zeros DB2


✅ Evitar overflow


✅ Revisar layouts


☕ O SEGREDO DOS VETERANOS

Veteranos protegem TODA divisão:

IF WS-QTD NOT = ZERO

Porque sabem:

matemática corporativa é território hostil.


🔥 CURIOSIDADE HISTÓRICA

O S0CB vem da arquitetura decimal do:

IBM System/360

Década de:

🏛️ 1960

IBM implementou aritmética decimal em hardware porque:

  • bancos

  • seguros

  • finanças

precisavam de precisão absoluta.


☕ EASTER EGG MAINFRAME

Veteranos brincam:

“S0CB significa:

Seu Programa Descobriu Que Não Existe Divisão Por Nada.”


🔥 O MAIOR ENSINAMENTO DO S0CB

Ele ensina algo profundo:

no mainframe, matemática é levada absurdamente a sério.

A CPU IBM Z NÃO tolera:

  • divisões impossíveis

  • overflow decimal

  • operandos inválidos


☕ A VERDADE FINAL

O S0C7 pune números inválidos.
O S0C4 pune memória inválida.
O S806 pune programas inexistentes.
O S913 pune acessos proibidos.

Mas…

☕ O S0CB É O MOMENTO EM QUE A PRÓPRIA MATEMÁTICA DO IBM Z DECIDE QUE SUA CONTA NÃO FAZ SENTIDO PARA O UNIVERSO.


sábado, 15 de junho de 2013

☕🔥 ABEND S0C7 — O “COLAPSO DECIMAL” DO MAINFRAME

 

Bellacosa Mainframe abend s0c7

☕🔥 ABEND S0C7 — O “COLAPSO DECIMAL” DO MAINFRAME

Quando o IBM Z Olha Para Seus Dados e Diz:

“ISSO NÃO É UM NÚMERO VÁLIDO.”

Se existe um ABEND que traumatiza TODO programador COBOL iniciante…

é o lendário:

🚨 S0C7

O verdadeiro ritual de passagem do mundo mainframe.

E normalmente ele aparece assim:

SYSTEM COMPLETION CODE=0C7

ou:

DATA EXCEPTION

ou ainda:

ASRA/S0C7

no CICS.

E naquele momento…

o Junior Padawan entra em crise existencial:

“MAS O CAMPO É NUMÉRICO!”
“O COBOL ME TRAIU!”
“O ARQUIVO ESTÁ AMALDIÇOADO?”
“O HEXADECIMAL VIROU DEMÔNIO?”

☕ Respira.

Porque o S0C7 é um dos ABENDs MAIS IMPORTANTES da história do mainframe.


🔥 O QUE É O S0C7?

O S0C7 é um:

🚨 DATA EXCEPTION

Traduzindo:

A CPU IBM Z TENTOU EXECUTAR UMA OPERAÇÃO NUMÉRICA COM DADOS INVÁLIDOS.


☕ A FILOSOFIA DO S0C7

O mainframe leva números MUITO a sério.

No mundo COBOL:

NUMÉRICO NÃO É “PARECE NÚMERO”.

Numérico precisa ser:

matematicamente válido em nível hexadecimal.


🔥 O QUE REALMENTE ACONTECE

Imagine:

ADD WS-VALOR TO WS-TOTAL

O COBOL gera instruções decimais do IBM Z.

A CPU lê:

packed decimal
zoned decimal
binary
display numeric

Mas encontra:

lixo

Resultado:

💥 S0C7


☕ ANALOGIA BELLACOSA MAINFRAME

Imagine um caixa eletrônico.

Você digita:

100

Tudo certo.

Mas imagine digitar:

ABACAXI

O sistema trava.

O S0C7 é isso.


🔥 O MAIOR SEGREDO

O S0C7 NÃO É “ERRO DO COBOL”.

É:

erro de DADOS.


☕ O MAIOR VILÃO DO UNIVERSO MAINFRAME

🚨 COMP-3

O lendário:

PACKED DECIMAL


🔥 O QUE É COMP-3?

Formato compactado decimal.

Exemplo:

PIC S9(7)V99 COMP-3

Armazenado em hexadecimal.


☕ COMO O PACKED FUNCIONA

Número:

12345

vira algo parecido com:

12 34 5C

O último nibble:

C

significa:

positivo


🔥 O PROBLEMA

Se aparecer:

12 34 AF

a CPU olha e diz:

❌ “ISSO NÃO É DECIMAL VÁLIDO.”

Resultado:

☠️ S0C7


☕ O S0C7 É HARDWARE

Isso é incrível.

O erro NÃO nasce no COBOL.

Nasce:

na própria CPU IBM Z.

O processador decimal detecta inconsistência.


🔥 O ERRO MAIS CLÁSSICO DA HISTÓRIA

MOVE 'ABC' TO WS-VALOR-NUM

Depois:

ADD 1 TO WS-VALOR-NUM

Resultado:

💥 S0C7


☕ O “MOVE MALDITO”

Outro clássico:

MOVE SPACES TO WS-VALOR

em campo numérico.

Mais tarde:

COMPUTE WS-TOTAL = WS-VALOR + 1

Boom.


🔥 O S0C7 FANTASMA

O mais assustador.

Erro acontece LONGE da causa real.


☕ EXEMPLO

Linha 100:

MOVE SPACES TO WS-NUM

Linha 5000:

ADD WS-NUM TO WS-TOTAL

Explosão.

O erro nasceu MUITO antes.


🔥 O VERDADEIRO DEMÔNIO: LAYOUT ERRADO

O campeão absoluto em produção.


☕ EXEMPLO

Arquivo real:

CAMPO-A = 10 bytes

COPYBOOK antigo:

CAMPO-A = 8 bytes

Agora TODOS os campos seguintes deslocam.

Campo numérico recebe lixo.

Resultado:

☠️ S0C7


🔥 O REDEFINES DA MORTE

Outro clássico.

01 REGISTRO.
   05 VALOR-NUM PIC 9(05).

01 REGISTRO-R REDEFINES REGISTRO.
   05 VALOR-TXT PIC X(05).

Depois:

MOVE 'ABCDE' TO VALOR-TXT
ADD 1 TO VALOR-NUM

Resultado:

💥 S0C7


☕ O S0C7 NO CICS

No CICS geralmente aparece como:

🚨 ASRA + S0C7

Porque o CICS intercepta o program check.


🔥 COMO INVESTIGAR O S0C7 PASSO A PASSO


✅ PASSO 1 — IDENTIFIQUE O OFFSET

Exemplo:

OFFSET X'01FA'

Esse é o endereço da explosão.


✅ PASSO 2 — PEGUE O LISTING COBOL

Cruze offset com:

  • SYSADATA

  • compile listing

  • Abend-AID

  • Fault Analyzer


✅ PASSO 3 — IDENTIFIQUE A LINHA

Exemplo:

ADD WS-SALDO TO WS-TOTAL

✅ PASSO 4 — DESCUBRA QUAL CAMPO ESTÁ SUJO

Agora começa CSI Mainframe.


🔥 O SEGREDO DOS HEXADECIMAIS

Veteranos olham dump em HEX.

Porque o problema REAL está lá.


☕ EXEMPLO VÁLIDO

F1 F2 F3

EBCDIC:

123

☕ EXEMPLO INVÁLIDO

C1 C2 C3

EBCDIC:

ABC

Em campo numérico:

☠️ S0C7


🔥 COMO LER O DUMP


☕ PSW

GPS do desastre.


☕ REGISTERS

Especialmente:

R1
R13
R14
R15

☕ STORAGE DUMP

Aqui mora a verdade.

Veterano encontra:

  • packed inválido

  • espaço em numérico

  • sinal incorreto

  • overlay


🔥 O HEXADECIMAL MAIS TEMIDO

40404040

EBCDIC:

espaços

Campo numérico cheio de espaços.

Clássico S0C7.


☕ O S0C7 E O FILE STATUS

Junior acha:

arquivo abriu = tudo bem

Não.

O conteúdo pode estar:

corrompido.


🔥 O S0C7 E O DB2

Outro clássico.

COLUNA:

DECIMAL(9,2)

Programa espera:

PIC 9(5)

Mismatch.

Resultado:

💥 dados inválidos


☕ O S0C7 E O SORT

Arquivo alterado por SORT errado.

Campos deslocados.

Resultado:

☠️ S0C7


🔥 COMO EVITAR S0C7


✅ Nunca mover spaces para numérico


✅ Validar NUMERIC

IF WS-CAMPO NUMERIC

✅ Revisar layouts


✅ Sincronizar copybooks


✅ Cuidado com REDEFINES


✅ Validar entrada externa


✅ Revisar COMP-3


☕ O TEST-NUMVAL — MAGIA MODERNA

COBOL moderno possui:

FUNCTION TEST-NUMVAL

Excelente defesa contra S0C7.


🔥 CURIOSIDADE HISTÓRICA

O S0C7 nasceu junto com:

System/360

Década de:

🏛️ 1960

IBM criou hardware decimal porque bancos precisavam:

  • precisão financeira

  • decimal real

  • sem erro binário


☕ EASTER EGG MAINFRAME

Veteranos brincam:

“S0C7 é o imposto obrigatório para virar programador COBOL.”

Porque TODO mundo toma pelo menos um.


🔥 O MAIOR ERRO DO PADAWAN

Ver:

S0C7

e corrigir apenas a linha do ADD.

Não.

A causa pode ter nascido:

milhares de linhas antes.


☕ A VERDADE FINAL

O S0C1 destrói instruções.
O S0C4 destrói memória.
Mas…

☕ O S0C7 DESTRÓI A ILUSÃO DE QUE “PARECE NÚMERO” É SUFICIENTE.

Porque no IBM Z…

CADA BYTE DECIMAL PRECISA SER ABSOLUTAMENTE PURO.


quarta-feira, 13 de fevereiro de 2013

☕🔥 ABEND ASRA — O “COLAPSO DA REALIDADE” NO CICS

 

Bellacosa Mainframe e o abend ASRA

☕🔥 ABEND ASRA — O “COLAPSO DA REALIDADE” NO CICS

Quando o CICS Olha Para Seu Programa e Diz:

“ALGO AQUI EXPLODIU.”

Se existe um erro que traumatiza todo programador COBOL iniciante em ambiente online…

é o lendário:

🚨 ASRA

E normalmente ele aparece assim:

DFHAC2001 TRANSACTION ABCD ABEND ASRA

ou:

AEI0
ASRA
PROGRAM CHECK

E naquele momento…

o Padawan COBOL entra em pânico.


☕ O QUE É O ASRA?

O ASRA é um:

🚨 ABEND DO CICS

Ele significa que:

💥 O PROGRAMA SOFREU UM PROGRAM CHECK

Traduzindo para linguagem humana:

O COBOL tentou fazer algo impossível.


🔥 O ASRA NÃO É O ERRO REAL

Isso é MUITO importante.

ASRA é apenas:

“O mensageiro da tragédia.”

O verdadeiro erro geralmente está por trás dele:

  • S0C7

  • S0C4

  • S0C1

  • S0CB

  • S0C6

  • Protection Exception

  • Data Exception

O CICS encapsula tudo isso em:

🚨 ASRA


☕ A FILOSOFIA DO ASRA

O CICS basicamente diz:

“Seu programa morreu durante execução.”

Mas não necessariamente ONDE.

Nem POR QUÊ.

Você precisa investigar.

E aí começa a jornada do Jedi Mainframe.


🔥 O ASRA MAIS FAMOSO DO UNIVERSO

🚨 ASRA + S0C7

O rei absoluto dos juniors COBOL.


☕ O QUE É O S0C7?

Erro de conversão decimal.

Exemplo clássico:

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

BOOM.

O processador decimal do IBM Z entra em colapso.


🔥 COMO O CICS ENXERGA ISSO

O COBOL gera instruções máquina.

O processador executa.

O hardware detecta:

❌ DADO INVÁLIDO PARA OPERAÇÃO DECIMAL

O z/OS gera:

S0C7

O CICS intercepta.

E transforma em:

ASRA

☕ ANALOGIA BELLACOSA MAINFRAME

Imagine:

O S0C7 é:

🔥 O MOTOR EXPLODINDO

E o ASRA é:

🚓 O POLICIAL FECHANDO A ESTRADA


🔥 OS VERDADEIROS VILÕES ESCONDIDOS ATRÁS DO ASRA


☠️ S0C7 — DATA EXCEPTION

O campeão absoluto.

Problema decimal.


☠️ S0C4 — PROTECTION EXCEPTION

Tentativa de acessar memória inválida.


☠️ S0C1 — OPERATION EXCEPTION

Código executável inválido.


☠️ S0CB — DECIMAL DIVIDE EXCEPTION

Divisão decimal impossível.

Exemplo:

DIVIDE 0 INTO WS-VALOR

☕ O QUE O PADAWAN PRECISA ENTENDER

No CICS:

ASRA ≠ causa raiz

ASRA = consequência.


🔥 O FLUXO DA TRAGÉDIA

COBOL
 ↓
EXECUÇÃO
 ↓
PROGRAM CHECK
 ↓
z/OS detecta exceção
 ↓
CICS intercepta
 ↓
ASRA

☕ O ERRO CLÁSSICO DO COBOL JUNIOR

01 WS-VALOR       PIC 9(05).
01 WS-TEXTO       PIC X(05).

MOVE 'ABCDE' TO WS-VALOR

Até aqui pode passar.

Mas depois:

ADD 1 TO WS-VALOR

Resultado:

💥 ASRA/S0C7


🔥 COMO INVESTIGAR O ASRA PASSO A PASSO

☕ PASSO 1 — IDENTIFIQUE A TRANSACTION

Mensagem típica:

DFHAC2001 TRANSACTION PAY1 ABEND ASRA

Transaction:

PAY1

☕ PASSO 2 — IDENTIFIQUE O PROGRAMA

O dump geralmente mostra:

PROGRAM: COBPAY01

Agora temos o suspeito principal.


☕ PASSO 3 — DESCUBRA O CÓDIGO REAL

O segredo está aqui:

PSW AT TIME OF ERROR
INTERRUPTION CODE

ou:

AP0001 ASRA CAUSED BY S0C7

Aí você encontra:

  • S0C7

  • S0C4

  • etc.


🔥 PASSO 4 — LOCALIZE O OFFSET

Exemplo:

OFFSET X'01A4'

Esse é o endereço onde tudo explodiu.


☕ O QUE É OFFSET?

É a posição da instrução dentro do programa load module.

Exemplo:

PROGRAMA + 01A4

🔥 COMO TRANSFORMAR OFFSET EM LINHA COBOL

Aqui nasce o verdadeiro Jedi.

Você precisa:

  • LISTING do compile

  • SYSADATA

  • Abend-AID

  • Fault Analyzer

  • XREF

No listing COBOL:

0001A4  ADD WS-TAXA TO WS-TOTAL

BOOM.

Achamos a linha assassina.


☕ O MAIOR SEGREDO DO MAINFRAME

O DUMP SEMPRE CONTA A HISTÓRIA.

O problema é:

Junior olha dump como Matrix.

Veterano lê dump como romance policial.


🔥 COMO LER O DUMP DO ASRA


☕ REGISTERS

Veja:

REGISTER 12
REGISTER 15

Eles ajudam localizar:

  • Base register

  • Programa

  • Endereço


☕ PSW — PROGRAM STATUS WORD

O “GPS do desastre”.

Mostra:

  • Onde morreu

  • Estado da CPU

  • Instrução ativa


☕ STORAGE DUMP

Mostra memória.

Veteranos encontram:

  • Campo inválido

  • Packed decimal corrompido

  • Byte hexadecimal estranho


🔥 O PACKED DECIMAL MALDITO

O maior assassino COBOL do planeta.

Exemplo:

PIC S9(7)V99 COMP-3

Packed decimal usa:

hexadecimal compactado

Se UM nibble estiver errado:

💥 S0C7


☕ EXEMPLO REAL DE HORROR

Packed válido:

12345C

Packed inválido:

12345F

ou:

12AB5C

Resultado:

🚨 DATA EXCEPTION


🔥 POR QUE ISSO ACONTECE?

Muitas vezes:

  • Arquivo corrompido

  • Layout errado

  • COPYBOOK desatualizado

  • Campo redefinido

  • REDEFINES perigoso

  • MOVE inválido

  • Overlay de memória


☕ O DEMÔNIO CHAMADO REDEFINES

Junior faz:

01 REGISTRO.
   05 VALOR-NUM PIC 9(05).

01 REGISTRO-R REDEFINES REGISTRO.
   05 VALOR-TXT PIC X(05).

Depois:

MOVE 'ABCDE' TO VALOR-TXT
ADD 1 TO VALOR-NUM

Resultado:

☠️ ASRA/S0C7


🔥 O ASRA S0C4 — O MAIS SOMBRIO

Esse assusta veteranos também.


☕ O QUE É S0C4?

Tentativa de acessar memória inválida.

Como:

  • Ponteiro errado

  • Tabela estourada

  • LINKAGE incorreta

  • DFHCOMMAREA inválida

  • Subscript fora do limite


☕ EXEMPLO

MOVE WS-TABELA(9999) TO WS-CAMPO

Mas a tabela tem:

100 posições

Resultado:

💥 S0C4 → ASRA


🔥 O CICS E A DFHCOMMAREA

Outro clássico.

Programa espera:

01 DFHCOMMAREA.
   05 WS-CODIGO PIC 9(05).

Mas recebe lixo.

Ou tamanho menor.

Resultado:

☠️ ASRA


☕ COMO SOBREVIVER AO ASRA


✅ PASSO 1

Descobrir:

QUAL PROGRAM CHECK?


✅ PASSO 2

Encontrar:

OFFSET


✅ PASSO 3

Mapear:

OFFSET → LINHA COBOL


✅ PASSO 4

Inspecionar:

  • Campos

  • Hexadecimal

  • COMP-3

  • REDEFINES

  • Tabelas

  • COMMAREA


🔥 FERRAMENTAS DOS DEUSES MAINFRAME


☕ Abend-AID

Transforma dump em algo humano.


☕ Fault Analyzer

Sherlock Holmes do z/OS.


☕ CEDF

Debug online do CICS.


☕ IPCS

Modo hardcore absoluto.


🔥 A ORIGEM HISTÓRICA

ASRA existe desde os primórdios do CICS.

Décadas de 70/80.

O nome vem de:

“ABNORMAL TERMINATION”

com classificação específica do CICS.

Ele virou lendário porque:

praticamente TODO programador COBOL CICS já tomou ASRA.


☕ CURIOSIDADE SOMBRIA

Veteranos dizem:

“Não existe programador COBOL experiente sem cicatriz de ASRA.”


🔥 EASTER EGG MAINFRAME

Muitos programadores brincam:

“ASRA significa:

A Surra Real da Aplicação.”

Porque normalmente ele aparece:

  • em produção

  • sexta-feira

  • fechamento mensal

  • ou 5 minutos antes da reunião.


☕ O MAIOR ERRO DO JÚNIOR

Olhar apenas:

ASRA

e parar.

Não.

O segredo está atrás dele.


🔥 A VERDADE FINAL

ASRA não é apenas um erro.

Ele é:

☕ O CICS REVELANDO QUE A REALIDADE BINÁRIA DO SEU PROGRAMA FOI QUEBRADA.

E no mundo mainframe…

TODO BYTE TEM CONSEQUÊNCIAS.


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