Ir para o conteúdo

Análise de Dumps (ST22)

📋 Visão Geral

A transação ST22 permite analisar dumps (short dumps) - erros em runtime que causam o término abrupto do programa. É essencial para diagnosticar e corrigir problemas em produção.


🎯 O que é um Dump?

Um dump ocorre quando: - Divisão por zero - Acesso a índice inválido de tabela - Conversão de dados inválida - Timeout de programa - Falta de memória - Autorização insuficiente

Exemplo de código que gera dump:

DATA: lv_result TYPE i,
      lv_divisor TYPE i VALUE 0.

lv_result = 10 / lv_divisor.  " ❌ DUMP: COMPUTE_INT_ZERODIVIDE


🔹 Aceder à ST22

Transaction Code

ST22

O que vês

  • Lista de dumps recentes
  • Filtros por data, utilizador, programa
  • Detalhes completos de cada dump

🔹 Estrutura de um Dump

1. Cabeçalho

Runtime Error: COMPUTE_INT_ZERODIVIDE
Date/Time: 04.11.2025 10:30:15
User: JSILVA
Program: Z_MEU_PROGRAMA

2. Descrição do Erro

Explicação em linguagem natural do que aconteceu.

3. Source Code Extract

Código onde o erro ocorreu:

18  DATA lv_divisor TYPE i VALUE 0.
19  
20  lv_result = 10 / lv_divisor.  " ←←← Erro aqui
21  
22  WRITE: / lv_result.

4. Call Stack (Pilha de Chamadas)

1. Z_MEU_PROGRAMA (Line 20)
2. PERFORM calcular (Line 15)
3. CLASS_METHOD processar (Line 45)

5. Conteúdo de Variáveis

Valores das variáveis no momento do erro:

lv_result   = 0
lv_divisor  = 0
sy-subrc    = 0
sy-tabix    = 1


💡 Erros Comuns e Soluções

1. COMPUTE_INT_ZERODIVIDE

Causa: Divisão por zero

" ❌ Problema
lv_result = lv_a / lv_b.  " lv_b = 0

" ✅ Solução
IF lv_b <> 0.
  lv_result = lv_a / lv_b.
ELSE.
  MESSAGE 'Divisor não pode ser zero' TYPE 'E'.
ENDIF.

2. ITAB_LINE_NOT_FOUND

Causa: Acesso a linha inexistente de tabela

" ❌ Problema
DATA(ls_cliente) = lt_clientes[ 999 ].  " Índice não existe

" ✅ Solução 1: READ TABLE com sy-subrc
READ TABLE lt_clientes INTO DATA(ls_cliente) INDEX 999.
IF sy-subrc = 0.
  " Processar
ENDIF.

" ✅ Solução 2: Expressão com OPTIONAL
DATA(ls_cliente) = VALUE #( lt_clientes[ 999 ] OPTIONAL ).
IF ls_cliente IS NOT INITIAL.
  " Processar
ENDIF.

3. CONVT_NO_NUMBER

Causa: Conversão inválida de texto para número

" ❌ Problema
DATA: lv_texto TYPE string VALUE 'ABC',
      lv_numero TYPE i.
lv_numero = lv_texto.  " Erro!

" ✅ Solução
TRY.
    lv_numero = lv_texto.
  CATCH cx_sy_conversion_no_number.
    MESSAGE 'Valor não é numérico' TYPE 'E'.
ENDTRY.

4. TSV_TNEW_PAGE_ALLOC_FAILED

Causa: Falta de memória (tabela muito grande)

" ❌ Problema
SELECT * FROM ekko INTO TABLE lt_docs.  " Milhões de registos!

" ✅ Solução 1: Limitar quantidade
SELECT * FROM ekko INTO TABLE lt_docs UP TO 10000 ROWS.

" ✅ Solução 2: Processar em pacotes
SELECT * FROM ekko INTO TABLE @DATA(lt_pacote)
  PACKAGE SIZE 1000.
  " Processar lt_pacote
ENDSELECT.

5. MOVE_CAST_ERROR

Causa: Cast de objeto inválido

" ❌ Problema
DATA: lo_animal TYPE REF TO lcl_animal.
lo_animal = NEW lcl_cao( ).
DATA(lo_gato) = CAST lcl_gato( lo_animal ).  " Erro! Não é gato

" ✅ Solução
IF lo_animal IS INSTANCE OF lcl_gato.
  DATA(lo_gato) = CAST lcl_gato( lo_animal ).
ELSE.
  MESSAGE 'Objeto não é do tipo esperado' TYPE 'E'.
ENDIF.

6. TIME_OUT

Causa: Programa excedeu tempo máximo

" ❌ Problema
DO 999999999 TIMES.
  " Loop infinito
ENDDO.

" ✅ Solução
DATA lv_max TYPE i VALUE 1000.
DO lv_max TIMES.
  " Processar
  IF sy-index >= lv_max.
    EXIT.
  ENDIF.
ENDDO.

🔍 Como Analisar um Dump

Passo 1: Identificar o Erro

Runtime Error: ITAB_LINE_NOT_FOUND
Pergunta: O que aconteceu?

Passo 2: Ver Código Fonte

20  DATA(ls_linha) = lt_tabela[ 100 ].  " ←←← Aqui
Pergunta: Onde aconteceu?

Passo 3: Analisar Call Stack

1. Z_PROGRAMA (Line 20)
2. FORM processar_dados (Line 15)
3. Main Program (Line 5)
Pergunta: Como chegámos aqui?

Passo 4: Verificar Variáveis

lt_tabela: 50 linhas
sy-index: 100
Pergunta: Qual era o estado?

Passo 5: Entender Causa Raiz

Conclusão: Tentei aceder à linha 100, mas tabela só tem 50 linhas.

Passo 6: Corrigir

" ✅ Solução
IF lines( lt_tabela ) >= 100.
  DATA(ls_linha) = lt_tabela[ 100 ].
ELSE.
  MESSAGE 'Tabela não tem linhas suficientes' TYPE 'E'.
ENDIF.

🛠️ Funcionalidades da ST22

Filtros

- Por data
- Por utilizador
- Por programa
- Por tipo de erro
- Por servidor

Ações

  • Analisar: Ver detalhes completos
  • Repetir: Tentar reproduzir (apenas em desenvolvimento)
  • Arquivar: Marcar como resolvido
  • Exportar: Guardar detalhes

📊 Estatísticas de Dumps

ST22 → Analysis → Statistics

Ver: - Dumps mais frequentes - Programas com mais problemas - Utilizadores afetados - Tendências ao longo do tempo


💡 Exemplo Completo de Análise

Dump Recebido

Runtime Error: ITAB_LINE_NOT_FOUND
Program: Z_RELATORIO_VENDAS
User: VENDEDOR01
Date: 04.11.2025 14:30:00

Código com Erro

45  LOOP AT lt_vendas INTO DATA(ls_venda).
46    DATA(ls_cliente) = lt_clientes[ kunnr = ls_venda-kunnr ].
47    WRITE: / ls_cliente-name1, ls_venda-netwr.
48  ENDLOOP.

Call Stack

Z_RELATORIO_VENDAS (Line 46)

Variáveis

lt_vendas: 100 linhas
lt_clientes: 80 linhas
ls_venda-kunnr: '0000099999'

Análise

  1. Problema: Cliente '0000099999' não existe em lt_clientes
  2. Causa: Dados inconsistentes (venda sem cliente)
  3. Solução: Usar READ TABLE com verificação

Correção

LOOP AT lt_vendas INTO DATA(ls_venda).
  READ TABLE lt_clientes INTO DATA(ls_cliente)
    WITH KEY kunnr = ls_venda-kunnr.

  IF sy-subrc = 0.
    WRITE: / ls_cliente-name1, ls_venda-netwr.
  ELSE.
    WRITE: / 'Cliente não encontrado:', ls_venda-kunnr.
  ENDIF.
ENDLOOP.

🎓 Boas Práticas

✅ Fazer

" 1. Sempre verificar sy-subrc
READ TABLE lt_tab INTO ls_linha INDEX 1.
IF sy-subrc = 0.
  " OK
ENDIF.

" 2. Usar TRY-CATCH para conversões
TRY.
    lv_numero = lv_texto.
  CATCH cx_sy_conversion_error.
    " Tratar erro
ENDTRY.

" 3. Validar antes de aceder
IF lines( lt_tab ) > 0.
  DATA(ls_first) = lt_tab[ 1 ].
ENDIF.

" 4. Limitar SELECTs
SELECT * FROM tabela INTO TABLE lt_data UP TO 10000 ROWS.

❌ Evitar

" 1. Acesso direto sem validação
DATA(ls_linha) = lt_tab[ 1 ].  " ❌ Pode não existir

" 2. Ignorar possibilidade de erro
lv_numero = lv_texto.  " ❌ Pode não ser número

" 3. SELECTs sem limite
SELECT * FROM tabela.  " ❌ Pode trazer milhões

" 4. Não documentar erros conhecidos
" Se conhece o problema, documente!

🔗 Transactions Relacionadas

  • ST22 - Análise de dumps
  • SM21 - System log (eventos do sistema)
  • ST11 - Developer traces
  • SM50 - Process overview
  • SAT - Runtime analysis

🔗 Próximos Passos


Tags: #Debug #ST22 #Dumps #Erros #Troubleshooting #ABAP