Translate

Mostrar mensagens com a etiqueta Debug COBOL. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta Debug COBOL. Mostrar todas as mensagens

domingo, 10 de março de 2019

☕💥 A Jornada do Padawan COBOL – Parte 3 Desvendando o Universo dos CALLs no Mainframe

 

Bellacosa Mainframe apresenta o CALL em Cobol Pàrte III

☕💥 A Jornada do Padawan COBOL – Parte 3

Desvendando o Universo dos CALLs no Mainframe

RETURN-CODE, GOBACK, Dumps, CEEDUMP, IPCS e os Segredos Jedi do Troubleshooting

Ou como descobrir que um simples S0C4 pode transformar uma madrugada tranquila em uma aventura digna de um RPG de nível 99

Por Vagner Bellacosa – Bellacosa Mainframe


O momento em que o Padawan encontra seu primeiro ABEND

Todo desenvolvedor Mainframe possui uma história.

Normalmente começa assim:

Segunda-feira.

02h47.

Janela de produção.

Telefone toca.

Gerente pergunta:

O batch das contas correntes caiu.

Você responde:

Qual erro?

Resposta:

S0C4.

Silêncio.

Você pega café.

Abre SDSF.

Começa a aventura.


O universo do RETURN-CODE

Uma das coisas mais elegantes do COBOL é a comunicação entre programas.

Nem tudo precisa explodir com um ABEND.

Podemos retornar informações.

Exemplo:

Programa Chamador

CALL 'VALIDA'

USING WS-CLIENTE


IF RETURN-CODE NOT = 0

DISPLAY "ERRO"

END-IF

Subprograma

IF CPF-INVALIDO

MOVE 8 TO RETURN-CODE

GOBACK

END-IF

Convenção mais utilizada

RCSignificado
0Sucesso
4Aviso
8Erro
12Erro Grave
16Fatal

Exemplo elegante

Subprograma

EVALUATE TRUE


WHEN CLIENTE-INATIVO

MOVE 4 TO RETURN-CODE


WHEN CPF-INVALIDO

MOVE 8 TO RETURN-CODE


WHEN SALDO-NEGATIVO

MOVE 12 TO RETURN-CODE


WHEN OTHER

MOVE 0 TO RETURN-CODE


END-EVALUATE

Por que isso é importante?

Evita ABEND.

Permite tratamento.

Sistema continua vivo.


GOBACK vs EXIT PROGRAM

Padawan adora copiar.

Mestre entende diferença.


STOP RUN

STOP RUN

Finaliza tudo.

Acabou.

Batch morre.


GOBACK

GOBACK

Retorna.

Educado.

Seguro.


EXIT PROGRAM

Muito usado em subprogramas.

EXIT PROGRAM

Volta ao chamador.


O preferido da IBM

GOBACK

Sempre.


O grande vilão

S0C4

O Darth Vader dos ABENDS.


O que significa?

Violação de armazenamento.


Tentou acessar

memória inválida.


Exemplo

CALL 'ROTINA'

USING WS-NOME

ROTINA

espera

LK-NOME


LK-ID


LK-DATA

Recebe apenas um.

Kaboom.


Como ocorre

CPU acessa

endereço inexistente.


Exemplo

00000000

ou

FFFFFFFF

Crash.


S0C7

Outro inimigo.


Exemplo

Campo contém

ABC

Programa espera

999

Código

ADD 1 TO WS-VALOR

ABEND.


S806

Muito comum.

Programa não encontrado.


Verificar

STEPLIB

JOBLIB

LNKLST

APF


U4038

Erro do LE.

Language Environment.


Normalmente

problemas de parâmetros.

Heap.

Stack.

Storage.


O CEEDUMP

Ferramenta dos Mestres.

Poucos usam.

Deveriam usar.

Muito.


Compilar

TEST

ou

LIST

Executar

gera

CEEDUMP


Possui

Stack

Registers

Storage

Offsets

Variáveis

Call Stack


Exemplo

MAIN


↓

VALIDA


↓

CPFCHK


↓

FORMATA


↓

ABEND

Melhor que adivinhar.


IPCS

Ferramenta lendária.

Poucos dominam.


Permite

abrir dump.

Examinar memória.

Ver registradores.

Offsets.

TCB.

PSW.


O segredo do Offset

Mensagem

IGZ0035S


OFFSET X'01A2'

LISTING

0001A2 MOVE WS-ID

Achou erro.


Capturando problemas

Técnica Bellacosa 1

Log antes.

DISPLAY 'ENTRADA'


DISPLAY WS-ID


DISPLAY WS-NOME

Técnica 2

Log depois.

DISPLAY 'RETORNO'

Técnica 3

Interface versionada

05 LK-VERSAO.


PIC X(02).

Técnica 4

Validar ponteiros

IF PTR = NULL

DISPLAY 'ERRO'

END-IF

Técnica 5

Checksum

Estruturas críticas.


Técnica 6

Tamanho esperado

IF LENGTH OF LK-AREA


NOT = 256

Descobrindo loops

CALL

A

B

C

A

B

C


CPU

100%


Usar

SMF

RMF

Strobe

APA


Detectando corrupção

Antes

MOVE WS-BLOCO TO WS-BKP

Depois

Comparar.

IF WS-BKP


NOT = WS-BLOCO

Monitorando produção

SMF 30

SMF 110

RMF


Dica Bellacosa

Nunca faça:

MOVE 16 TO RETURN-CODE
CONTINUE

E ignore.


Faça

IF RETURN-CODE > 0

DISPLAY MSG


PERFORM LOG


END-IF

Easter Egg Mainframe

Existe em praticamente todos os bancos:

Programa

GENCALL

ou

UTIL0001

Possui:

7000 linhas.

300 CALLs.

120 IFs.

47 GO TO.

3 autores.

Última alteração:

Documentação:

Nenhuma.


Produção:

Executa há vinte anos.


Ninguém mexe.


É conhecido como:

O Boss Final do Mainframe™


Checklist Jedi de Troubleshooting

✅ Verificar RETURN-CODE

✅ Conferir parâmetros

✅ Conferir ordem

✅ Conferir tamanho

✅ Conferir LISTING

✅ Conferir CEEDUMP

✅ Conferir Offset

✅ Conferir STEPLIB

✅ Conferir Binder

✅ Conferir RENT

✅ Conferir Work-Storage

✅ Conferir Local-Storage

✅ Conferir ponteiros

✅ Conferir versão da interface

✅ Conferir quantidade de cafés consumidos


A Filosofia Jedi do CALL – Parte 3

O Padawan iniciante acredita:

"O programa caiu."

O desenvolvedor intermediário pensa:

"Preciso achar a linha."

O Mestre Mainframe sabe:

O programa nunca cai sozinho.

Ele deixa pistas.

Offsets.

PSW.

CEEDUMP.

Registers.

SMF.

IPCS.

RETURN-CODE.

Storage.

Call Stack.

E o verdadeiro Jedi do z/OS aprende que depurar um problema em produção não é apenas corrigir um bug.

É fazer arqueologia digital em sistemas que processam bilhões de transações por dia, compreender contratos invisíveis entre programas escritos ao longo de décadas e transformar um assustador S0C4 das 3 da manhã em apenas mais uma história para contar tomando um café no Bellacosa Mainframe.


Na Parte 4, o Padawan enfrentará o conteúdo avançado: Reentrância, RENT/NORENT, Thread Safety, HEAP, STACK, CICS, LE, AMODE 31/64, otimização extrema de CALLs, microbenchmarks e os segredos utilizados pelos arquitetos de sistemas IBM Z para executar milhões de chamadas por segundo com segurança.


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.


quinta-feira, 21 de março de 2013

☕🔥 ABEND AICA — O “RELÓGIO DA MORTE” DO CICS

 

Bellacosa Mainframe e o abend aica

☕🔥 ABEND AICA — O “RELÓGIO DA MORTE” DO CICS

Quando o CICS Grita:

“SEU PROGRAMA ESTÁ DEMORANDO DEMAIS!”

Se existe um ABEND que transforma CPU em panela de pressão…

é o temido:

🚨 AICA

E normalmente ele aparece assim:

DFHAC2206 TRANSID PAY1 ABEND AICA

ou:

AICA - TASK TIMEOUT

E naquele momento…

o programador COBOL Junior Padawan pensa:

“O programa travou?”
“Entrou em loop?”
“O CICS odiou meu SELECT?”
“A CPU pegou fogo?”

☕ Respira.

Porque o AICA é um dos ABENDs MAIS IMPORTANTES para entender performance no mundo CICS.


🔥 O QUE É O AICA?

O AICA significa:

🚨 TASK TIMEOUT NO CICS

Traduzindo:

Seu programa ficou tempo demais usando CPU ou não devolveu controle ao CICS.

E o CICS decidiu:

☠️ “CHEGA. VOU MATAR ESSA TASK.”


☕ A FILOSOFIA DO AICA

O CICS é um ambiente:

MULTIUSUÁRIO

Milhares de usuários podem estar online:

  • ATM

  • PIX

  • cartão

  • aeroporto

  • seguro

  • banco

  • governo

Se UMA transaction monopolizar CPU…

TODO MUNDO SOFRE.

Então o CICS age como um vigilante.


🔥 O CICS NÃO É PACIENTE

No batch, um loop pode rodar horas.

No CICS?

❌ IMPOSSÍVEL.

O ambiente online exige:

  • resposta rápida

  • baixa latência

  • fairness

  • compartilhamento de CPU


☕ O QUE REALMENTE ACONTECE

Seu programa entra em execução:

EXEC CICS LINK

ou:

PERFORM UNTIL...

Mas ele:

  • nunca termina

  • consome CPU demais

  • entra em loop

  • fica preso

  • não libera controle

Então o CICS monitora o tempo.

Quando excede o limite:

💥 AICA


🔥 O GRANDE SEGREDO

AICA geralmente NÃO é erro de sintaxe.

É:

erro de lógica

erro de performance

loop infinito

design ruim


☕ O MAIOR VILÃO DO AICA

🚨 LOOP INFINITO

O clássico dos clássicos.


🔥 EXEMPLO COBOL JUNIOR

PERFORM UNTIL WS-FIM = 'S'

   DISPLAY 'PROCESSANDO'

END-PERFORM

Mas…

WS-FIM nunca vira 'S'

Resultado:

☠️ CPU sobe

task trava

CICS mata

AICA


☕ O LOOP ASSASSINO SILENCIOSO

Mais perigoso ainda:

PERFORM VARYING IDX FROM 1 BY 1
   UNTIL IDX > 100

   CONTINUE

END-PERFORM

Parece normal.

Mas imagine:

IDX corrompido

ou:

MOVE ZERO TO IDX

dentro do loop.

Agora ele nunca acaba.


🔥 O AICA E O “CICS DISPATCHER”

Aqui nasce o verdadeiro conhecimento Jedi.

O CICS possui um:

DISPATCHER

Ele controla:

  • CPU

  • tasks

  • prioridades

  • escalonamento

Quando uma task “segura a CPU” demais:

🚨 TIMEOUT


☕ O CONCEITO MAIS IMPORTANTE

No CICS:

VOCÊ NÃO “POSSUI” A CPU.

Você “empresta” CPU por alguns milissegundos.


🔥 COMO O CICS DETECTA O AICA

O sistema monitora:

  • elapsed time

  • CPU time

  • dispatch time

  • runaway task

Quando excede o parâmetro:

ICVTSD

ou limites internos…

💥 AICA


☕ O NOME REAL DO PROBLEMA

Muitos veteranos chamam AICA de:

🚨 RUNAWAY TASK

Task descontrolada.


🔥 O ERRO CLÁSSICO COM EXEC CICS

Outro caso famoso:

EXEC CICS READQ TS
END-EXEC

Dentro de um loop gigantesco.

Agora o programa:

  • chama CICS milhares de vezes

  • monopoliza recursos

  • explode consumo

Resultado:

☠️ AICA


☕ O AICA E O “WAIT”

Outro erro mortal:

Programa esperando algo que nunca chega.

Exemplo:

  • ENQ

  • recurso preso

  • deadlock lógico

  • polling infinito


🔥 O CASO DO “DISPLAY LOOP”

Junior faz debug assim:

PERFORM UNTIL WS-FIM = 'S'

   DISPLAY 'DEBUG'

END-PERFORM

Em batch?

Talvez sobreviva.

No CICS?

💀 Você acabou de invocar o AICA ancestral.


☕ COMO INVESTIGAR O AICA PASSO A PASSO


✅ PASSO 1 — IDENTIFIQUE A TRANSACTION

Mensagem:

DFHAC2206 TRANSID PAY1 ABEND AICA

Transaction:

PAY1

✅ PASSO 2 — IDENTIFIQUE O PROGRAMA

Dump:

PROGRAM = COBPAY01

✅ PASSO 3 — ANALISE O LOOP

Pergunte:

  • Existe PERFORM infinito?

  • Alguma condição nunca muda?

  • Índice travado?

  • Cursor eterno?

  • EXEC CICS dentro de loop?


✅ PASSO 4 — VERIFIQUE CPU

Ferramentas:

  • CICS Monitoring

  • Omegamon

  • SMF

  • CMF

  • RMF


🔥 COMO LER O DUMP DO AICA

O dump do AICA é MUITO interessante.

Porque frequentemente mostra:

o programa “congelado no tempo”.


☕ O QUE OLHAR


PSW

Mostra onde estava executando.


REGISTERS

Mostram:

  • base register

  • endereço

  • loop atual


TRACE

O ouro do CICS.

Mostra:

  • EXEC CICS repetitivos

  • chamadas infinitas

  • fluxo preso


🔥 O SEGREDO DO OFFSET

Exemplo:

OFFSET X'02FA'

Agora você cruza com o listing COBOL.

E encontra:

PERFORM UNTIL WS-END = 'Y'

Boom.

Achamos o monstro.


☕ O MAIOR ERRO DO PADAWAN

Pensar:

“O CICS travou.”

Na verdade:

O PROGRAMA NÃO PAROU.


🔥 O AICA E O PSEUDO-CONVERSATIONAL

Aqui entra arquitetura mainframe avançada.

CICS NÃO gosta de programas longos.

Ele prefere:

pseudo-conversational processing

Fluxo:

EXEC CICS RETURN TRANSID(...)

O programa devolve controle.

Depois volta mais tarde.

Isso evita:

  • task longa

  • retenção de memória

  • runaway task


☕ PROGRAMADORES BATCH SOFREM COM ISSO

Porque batch pensa:

processa tudo agora

CICS pensa:

responda rápido e saia

🔥 O AICA EM PRODUÇÃO

O cenário clássico:

Sexta-feira

fechamento mensal

pico bancário

CPU alta

E então:

AICA

Todo mundo entra em guerra.


☕ EASTER EGG MAINFRAME

Veteranos brincam:

“AICA significa:

Ainda Estou Calculando Aqui.”

Porque o programa parece nunca terminar.


🔥 CURIOSIDADE HISTÓRICA

Nos anos 70/80:

Runaway tasks podiam derrubar regiões CICS inteiras.

Então IBM endureceu agressivamente o controle de timeout.

O AICA virou mecanismo de sobrevivência do ambiente online.


☕ COMO EVITAR AICA


✅ Loops controlados


✅ Sempre alterar condição de saída


✅ Evitar EXEC CICS em loops gigantes


✅ Usar pseudo-conversational


✅ Limitar processamento online


✅ Monitorar CPU


🔥 O AICA E O “THINK TIME”

CICS odeia programas esperando usuário.

Nunca faça:

espera longa dentro da task

Porque task parada também consome recursos.


☕ O QUE O JEDI MAINFRAME APRENDE

AICA não é apenas um ABEND.

Ele ensina:

arquitetura online

compartilhamento de CPU

disciplina transacional

eficiência

design enterprise


🔥 FRASE FINAL DO MUNDO CICS

O ASRA quebra a realidade.
O S0C7 corrompe os números.
Mas…

☕ O AICA É O CICS ELIMINANDO PROGRAMAS QUE ESQUECERAM QUE O TEMPO É SAGRADO.

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.


sábado, 24 de fevereiro de 2007

O que é COBOL Bug Trap e Captura de ABEND?

Bellacosa Mainframe o que é Bug Trap em Cobol


O que é COBOL Bug Trap e Captura de ABEND?

Em ambientes Mainframe, especialmente em aplicações críticas, um dos maiores desafios é descobrir rapidamente:

Por que o programa falhou?
Onde ocorreu o erro?
Qual variável causou o problema?

Para isso existem mecanismos conhecidos como:

Bug Trap

e

Captura de ABEND


O que é um ABEND?

ABEND significa:

Abnormal End

Ou seja:

Finalização Anormal

O programa termina devido a um erro.


Exemplos de ABENDs comuns

ABENDCausa
S0C7Erro de dados numéricos
S0C4Violação de memória
S806Programa não encontrado
SB37Falta de espaço
U4038Erro definido pela aplicação
ASRAExceção em CICS

Exemplo de S0C7

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

Resultado:

S0C7

O Problema

Sem diagnóstico adequado você recebe apenas:

JOB ABENDED

e precisa descobrir:

Qual campo?
Qual linha?
Qual programa?

O que é Bug Trap?

Bug Trap é uma técnica ou ferramenta que captura informações detalhadas antes do programa terminar.

Objetivo:

Transformar um ABEND misterioso
em um erro fácil de analisar

O que o Bug Trap captura?

  • Nome do programa

  • Data e hora

  • Parágrafo COBOL

  • Variáveis

  • SQLCODE

  • CICS EIBRESP

  • Chave VSAM

  • Dados recebidos

  • Stack de chamadas


Fluxo Simplificado

Erro
 ↓
Bug Trap
 ↓
Captura informações
 ↓
Gera relatório
 ↓
ABEND

Exemplo

Sem Bug Trap:

S0C7

Com Bug Trap:

PROGRAMA = FIN001

PARAGRAFO = CALCULA-JUROS

CAMPO = WS-SALDO

VALOR = ABCDEF

ABEND = S0C7

Captura de ABEND no COBOL

Uma prática comum é criar rotinas padronizadas.


Exemplo

IF SQLCODE NOT = 0

   PERFORM TRATA-ERRO

END-IF

Rotina de Tratamento

TRATA-ERRO.

DISPLAY 'ERRO SQL'

DISPLAY SQLCODE

MOVE 16 TO RETURN-CODE

STOP RUN.

Capturando FILE STATUS

Muito comum em arquivos.


READ ARQCLIENTE

IF WS-FS NOT = '00'

   DISPLAY 'ERRO LEITURA'

   DISPLAY WS-FS

END-IF

Captura de SQLCODE

Programas DB2.


EXEC SQL

   SELECT ...

END-EXEC

IF SQLCODE NOT = 0

   DISPLAY SQLCODE

END-IF

Captura de CICS

Programas online.


EXEC CICS

   READ FILE(...)

   RESP(WS-RESP)

END-EXEC

IF WS-RESP NOT = DFHRESP(NORMAL)

   DISPLAY WS-RESP

END-IF

Uso de Declaratives

COBOL possui tratamento nativo.


DECLARATIVES.

ARQ-ERROR SECTION.

USE AFTER STANDARD ERROR PROCEDURE
ON ARQCLIENTE.

DISPLAY 'ERRO ARQUIVO'.

END DECLARATIVES.

LE Condition Handler

No ambiente IBM Language Environment (LE).


Pode interceptar:

S0C7
S0C4
Overflow
Underflow

Ferramentas modernas utilizam LE para coletar:

  • Call Stack

  • Variáveis

  • Offset

  • PSW


Ferramentas Comerciais


IBM Fault Analyzer

Uma das mais utilizadas.

Captura automaticamente:

  • ABEND

  • Variáveis

  • Fonte COBOL

  • Call Stack


IBM Application Performance Analyzer

Auxilia análise de execução.


Abend-AID

Muito popular em bancos.

Produz relatórios detalhados.


Xpediter

Debug e análise de falhas.


Exemplo Fault Analyzer

Após um S0C7:

ABEND S0C7

PROGRAMA:
FIN001

PARAGRAFO:
CALCULA-PARCELA

CAMPO:
WS-VALOR

CONTEUDO:
ABC123

Exemplo Abend-AID

Mostra:

Linha COBOL

Variáveis

Offsets

Call Stack

Storage

Captura Manual (Estilo Bellacosa)

Uma prática comum é criar um copybook corporativo.


COPY LOGERRO.

Sempre que ocorrer erro:

PERFORM REGISTRA-ERRO

Grava:

Programa

Parágrafo

Usuário

Data

Hora

SQLCODE

File Status

Mensagem

Exemplo de Log

PROGRAMA=FIN001

PARAGRAFO=ATUALIZA-SALDO

SQLCODE=-911

USUARIO=BELLA01

DATA=20260801

HORA=14:35:21

Captura de Call Stack

Especialmente importante em:

CALL
CALL
CALL
CALL

Exemplo:

MAIN
 ↓
CALCULO
 ↓
JUROS
 ↓
VALIDA

Erro ocorreu em:

VALIDA

Captura de Dumps

Ferramentas analisam:

SYSUDUMP
SYSABEND
CEEDUMP

CEEDUMP

Muito usado com Language Environment.

Contém:

  • variáveis;

  • registradores;

  • call stack;

  • offsets.


Boas Práticas

✅ Sempre verificar FILE STATUS

✅ Sempre verificar SQLCODE

✅ Tratar RESP em CICS

✅ Gerar logs padronizados

✅ Produzir CEEDUMP

✅ Utilizar Fault Analyzer ou Abend-AID

✅ Registrar contexto do erro


Curiosidade

Em muitos bancos, mais de 90% dos incidentes COBOL são resolvidos sem abrir um dump completo porque as rotinas de Bug Trap já registram:

Programa
Parágrafo
Campo
Valor inválido
Usuário
Transação

permitindo localizar a causa raiz em poucos minutos.


Resumo Rápido

ConceitoFunção
ABENDFinalização anormal
S0C7Erro numérico
S0C4Violação memória
Bug TrapCaptura contexto do erro
CEEDUMPDump do LE
SYSUDUMPDump sistema
SQLCODEErro DB2
FILE STATUSErro arquivo
RESPErro CICS
Fault AnalyzerDiagnóstico IBM
Abend-AIDDiagnóstico avançado
XpediterDebug

Conclusão

Bug Trap é o conjunto de técnicas e ferramentas utilizadas para capturar informações detalhadas antes ou durante um ABEND. Em ambientes COBOL corporativos, ele é essencial para acelerar a análise de incidentes, identificar a causa raiz e reduzir drasticamente o tempo de diagnóstico de erros em aplicações Batch, CICS, IMS e DB2.