MCU & FPGA geral GDB para STM32: Cheat Sheet Profissional de Depuração com OpenOCD, HardFault e FreeRTOS

GDB para STM32: Cheat Sheet Profissional de Depuração com OpenOCD, HardFault e FreeRTOS


O que é o GDB no mundo STM32 e como montar o “pipeline” de depuração

Table of Contents

Table of Contents

Quando você depura um firmware STM32 “de verdade”, quase nunca é só o GDB sozinho. O que funciona bem na prática é um encadeamento de peças: o seu binário ELF com símbolos de depuração, o GDB (cliente), um servidor de debug (normalmente OpenOCD ou o servidor do ST-LINK), e o hardware de debug (ST-LINK/J-LINK) falando SWD (Serial Wire Debug) ou JTAG com o microcontrolador. O GDB é quem dá os comandos (parar, continuar, inspecionar memória, ler registradores, dar step, colocar breakpoints), mas ele conversa com o alvo por meio de um “servidor GDB” (GDB server) que traduz essas intenções para transações no barramento de debug do chip.

O primeiro ponto que separa uma depuração tranquila de uma sofrida é o seu build. Em STM32, o ideal é compilar com símbolos e com otimizações amigáveis à depuração. Na prática, isso significa incluir -g e preferir -Og (em vez de -O2/-O3) durante a fase de debug, porque -Og tenta manter o código legível para o depurador sem virar um firmware “tartaruga”. Em projetos com CMake, Makefile ou no próprio STM32CubeIDE, a ideia é a mesma: gerar um ELF (não apenas .bin/.hex) e garantir que ele carregue DWARF de debug. Sem ELF com símbolos, o GDB até conecta, mas você perde o principal: nomes de variáveis, linhas de código e backtraces confiáveis.

A segunda base é decidir qual servidor você vai usar. Com STM32, o caminho mais comum (e bem compatível com GDB puro) é OpenOCD. Ele sobe um servidor local que expõe uma porta TCP para o GDB (tipicamente :3333) e, em paralelo, expõe uma porta telnet (:4444) para comandos próprios do OpenOCD. Esse detalhe é importante porque, durante a depuração, você vai misturar dois “dialetos”: comandos do GDB e comandos “monitor” (que o GDB repassa ao servidor). Em outras palavras, quando você digita monitor reset halt, isso não é GDB nativo; é o GDB dizendo para o OpenOCD executar um reset e parar o core.

A seguir está o fluxo mínimo, bem “pé no chão”, que você usa em qualquer STM32 com ST-LINK via SWD, assumindo que você já tem arm-none-eabi-gdb (ou gdb-multiarch) e OpenOCD instalados, e que seu projeto já gerou firmware.elf.

  1. Em um terminal, suba o OpenOCD (exemplo genérico; o arquivo de target muda conforme a família STM32 e o probe):
openocd -f interface/stlink.cfg -f target/stm32f4x.cfg

Se tudo estiver ok, você verá o OpenOCD dizendo que abriu a porta do GDB server (geralmente 3333). Agora, em outro terminal, você entra com o GDB apontando para o seu ELF:

arm-none-eabi-gdb firmware.elf

Dentro do GDB, o “ritual” inicial que mais evita dor de cabeça é: conectar no servidor remoto, garantir reset/halt, configurar break no main, carregar o binário (quando apropriado) e rodar:

target extended-remote :3333
monitor reset halt
break main
load
continue

Aqui entram três observações práticas que você vai agradecer depois. Primeiro, target extended-remote é útil porque permite alguns recursos a mais (como reconectar melhor e usar run em certos cenários), mas target remote também funciona na maioria dos casos. Segundo, load grava flash via servidor de debug; se você já gravou o firmware por outro meio (CubeProgrammer, por exemplo) e só quer depurar, você pode pular o load e apenas anexar e rodar. Terceiro, monitor reset halt é o “seguro de vida” quando o firmware está resetando rápido, travando o barramento, mexendo em clock ou entrando em low-power agressivo; você força o core a ficar parado antes do estrago acontecer.

Casos de uso típicos que esse setup já resolve

Um caso muito comum é “meu firmware dá boot e reseta em loop, não consigo nem ver a primeira mensagem na UART”. Com o fluxo acima, você conecta, dá monitor reset halt, coloca break main (ou até break Reset_Handler/break SystemInit se precisar pegar antes), e então continue para ir soltando o código sob controle. Outro caso clássico é “minha interrupção está disparando e eu não sei quem mexe nessa variável”. Assim que você tiver o core sob controle, você coloca breakpoints e watchpoints (a gente chega neles nas próximas seções) e transforma a depuração em um processo determinístico, em vez de “chute”.

0 0 votos
Classificação do artigo
Inscrever-se
Notificar de
guest
0 Comentários
mais antigos
mais recentes Mais votado
Feedbacks embutidos
Ver todos os comentários

Related Post

Pós-graduações em Sistemas Embarcados e IoT no Brasil: Especializações, MBAs e MestradosPós-graduações em Sistemas Embarcados e IoT no Brasil: Especializações, MBAs e Mestrados

Este artigo apresenta um levantamento detalhado e organizado das principais pós-graduações em Sistemas Embarcados e Internet das Coisas (IoT) disponíveis no Brasil, abrangendo especializações lato sensu, MBAs voltados à Indústria

0
Adoraria saber sua opinião, comente.x