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
Passo 2: Ver Código Fonte
20 DATA(ls_linha) = lt_tabela[ 100 ]. " ←←← Aqui
Passo 3: Analisar Call Stack
1. Z_PROGRAMA (Line 20)
2. FORM processar_dados (Line 15)
3. Main Program (Line 5)
Passo 4: Verificar Variáveis
lt_tabela: 50 linhas
sy-index: 100
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
- Problema: Cliente '0000099999' não existe em lt_clientes
- Causa: Dados inconsistentes (venda sem cliente)
- 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
- SAT - Analisar performance
- Debugger - Prevenir dumps com debug
- Watchpoints - Rastrear mudanças
Tags: #Debug #ST22 #Dumps #Erros #Troubleshooting #ABAP