GDB + STM32 — Cheat Sheet Profissional de Depuração
Este é um guia compacto, direto ao ponto, pensado para uso real em bancada ou laboratório. Ideal para manter ao lado do terminal quando estiver depurando firmware STM32 via OpenOCD + arm-none-eabi-gdb.
1️⃣ Inicialização Padrão da Sessão
Subir OpenOCD
openocd -f interface/stlink.cfg -f target/stm32f4x.cfg
Iniciar GDB
arm-none-eabi-gdb firmware.elf
Conectar e preparar alvo
target extended-remote :3333
monitor reset halt
load
break main
continue
2️⃣ Controle de Execução
| Ação | Comando |
|---|---|
| Continuar | continue |
| Próxima linha (não entra na função) | next |
| Entrar na função | step |
| Próxima instrução assembly | nexti |
| Instrução assembly entrando | stepi |
| Sair da função atual | finish |
3️⃣ Breakpoints
break main
break file.c:42
break function_name
break file.c:42 if counter == 100
Gerenciar:
info breakpoints
disable 1
enable 1
delete 1
⚠️ STM32 tem número limitado de hardware breakpoints.
4️⃣ Watchpoints (Detecção de Corrupção)
watch variable
rwatch variable
awatch variable
Extremamente útil para:
- Corrupção por DMA
- Escrita fora de array
- ISR alterando variável inesperadamente
Limite: poucos comparadores de hardware disponíveis.
5️⃣ Inspeção de Variáveis
print var
p/x var # hexadecimal
p/t var # binário
p *ptr
display var
undisplay 1
6️⃣ Registradores Cortex-M
info registers
p $pc
p $sp
p $lr
Modificação (cuidado):
set $pc = 0x08001234
7️⃣ Leitura e Escrita de Memória
Formato geral:
x/NFU ENDERECO
Onde:
- N = quantidade
- F = formato (x, d, t)
- U = unidade (b, h, w, g)
Exemplos:
x/4xw 0x40021000
x/16xw adcBuffer
Escrever:
set {uint32_t}0x48000014 = 0x00000001
8️⃣ HardFault — Procedimento Profissional
Quando cair em HardFault:
bt
info registers
x/8xw $sp
Extrair PC salvo:
p/x *((uint32_t*)$sp + 6)
list *0xENDERECO
Verificar registradores de fault:
x/4xw 0xE000ED28
SCB:
- CFSR
- HFSR
9️⃣ Verificação de Stack
p/x $sp
Comparar com faixa da RAM (ex: 0x20000000).
Stack corrompida → provável overflow.
🔟 Debug de Periféricos
GPIO
x/1xw GPIOx_ODR
RCC
x/1xw RCC_AHB1ENR
Timer
x/1xw TIMx_CNT
ADC
x/1xw ADC_SR
Sempre confirme clock antes de culpar periférico.
1️⃣1️⃣ FreeRTOS
info threads
thread 2
bt
Ver TCB atual:
p *pxCurrentTCB
1️⃣2️⃣ Bootloader Debug
Ver vetor:
x/2xw 0x08008000
Forçar salto:
set $sp = *(uint32_t*)0x08008000
set $pc = *(uint32_t*)0x08008004
continue
1️⃣3️⃣ Dual Core (STM32H7)
monitor targets
monitor target 1
1️⃣4️⃣ Semihosting
monitor arm semihosting enable
1️⃣5️⃣ SWO / ITM
Usar para:
- Log sem parar sistema
- Trace leve
- Debug tempo real
Melhor alternativa ao printf bloqueante.
1️⃣6️⃣ Macros Úteis
Criar comando reset + run:
define rr
monitor reset halt
load
break main
continue
end
Uso:
rr
1️⃣7️⃣ Debug de Clock
Interceptar antes de configurar PLL:
break SystemClock_Config
continue
1️⃣8️⃣ Diagnóstico Rápido (Checklist de Emergência)
Se firmware travou:
monitor reset haltbtinfo registersx/8xw $sp- Verificar SCB fault
- Conferir RCC
- Conferir stack pointer
- Conferir ponteiros
Nunca debugue por tentativa e erro.
🧠 Modelo Mental Profissional
Depuração embarcada é:
- Medir estado real
- Confirmar hipóteses
- Isolar causa
- Validar solução
Não é:
- Colocar printf até funcionar
- Alterar código aleatoriamente
- Culpar HAL antes de verificar registradores