Ir para o conteúdo principal

Depurador GDB

GDB é um depurador de código-fonte poderoso. Você pode usá-lo para depurar seu código Arduino no Wokwi.

Usando o GDB no Wokwi

Para iniciar uma sessão do GDB, vá para o editor de código e pressione F1. No prompt que foi aberto, digite "GDB", e selecione "Start Web GDB Session (debug build)".

Isso abrirá uma nova guia do navegador com o prompt do GDB. Se esta é a primeira vez que você está usando este recurso, pode levar até 30 segundos para o GDB carregar totalmente.

Exemplo de Sessão do Depurador

Quando o GDB estiver pronto, você receberá o seguinte prompt de comando:

0x00000000 in __vectors ()
(gdb)

Neste ponto, você pode digitar comandos GDB. Por exemplo, suponha que você deseja executar seu programa linha por linha, a partir do setup(). Primeiro, digite tbreak setup e c para iniciar o programa e executá-lo até o início do setup():

(gdb) tbreak setup
Temporary breakpoint 1 at 0x2ca: file sketch.ino, line 28.
(gdb) c
Continuing.

Temporary breakpoint 1, setup () at sketch.ino:28
28 pinMode(LED_BUILTIN, OUTPUT);
(gdb)

Neste ponto, digite layout src para mostrar o código-fonte do seu programa e digite next para executar a próxima linha do código-fonte. Você pode então digitar next repetidamente para repassar o código linha por linha.

Se você quiser imprimir o valor de alguma variável, use o comando print. Por exemplo, se você tem uma variável chamada ledIndex, digite print ledIndex para imprimir o valor dessa variável.

Guia de Referência Rápida

Lista de comandos GDB mais comuns para depuração de código AVR.

Execução do programa

ComandoForma curtaDescrição
continuecRoda o programa
advance setupadv setupRoda o programa e para no início da função setup()*
nextnExecuta a próxima linha de código (passando por cima)
stepsAvança para a próxima linha de código
finishfinRoda o programa até que a função atual retorne (sair)
nextinExecuta a próxima instrução (passando por cima)
stepisiAvança para a próxima instrução
untiluIgual ao comando next, mas não fica em loop
Ctrl+CQuebra o programa na instrução atual
  • O comando de avanço também irá parar se retornar na função atual

Pontos de interrupção

ComandoForma curtaDescrição
info breakpointsi bMostra uma lista de todos os pontos de interrupção
break loopb loopDefine um ponto de interrupção no início do loop()
break 42b 42Define um ponto de interrupção na linha 42
break *0x156b *0x156Define um ponto de interrupção no endereço do programa 0x156
tbreak looptb loopDefine um ponto de interrupção único (temporário) em loop()
clear loopcl loopRemove quaisquer pontos de interrupção que esteja em loop()
clear 42cl 42Remove ponto de interrupção que esteja na linha 42
delete 1d 1Remove ponto de interrupção número 1
disabledisDesativa todos os pontos de interrupção
disable 1dis 1Desativa ponto de interrupção número 1
enableenHabilita todos os pontos de interrupção
enable 1en 1Habilita ponto de interrupção número 1
enable once 1en once 1Habilita ponto de interrupção número 1 uma única vez

Pilha de chamadas

ComandoForma curtaDescrição
backtracebtMostra um backtrace da pilha de chamadas atual
backtrace -fullbt -fuExibe backtrace incluindo variáveis ​​locais
info argsi arDump (despejo) dos argumentos da função atual
info localsi loDump das variáveis ​​locais e seus valores
info registersi rDump dos registradores da MCU
faas info argsfa i arDump dos argumentos de todas as funções na pilha de chamadas
frame 2f 2Seleciona o frame número 2
upVá um frame da pilha para cima (por exemplo, chamada de função)
downdoVá um frame da pilha para baixo

Código de inspeção

ComandoForma curtaDescrição
list loopl loopExibe o código fonte da função loop()
disassembledisasDisassemble (desmonte) a localização atual do programa
disassemble/sdisas/sDisassemble incluindo o código-fonte
disassemble/rdisas/rDisassemble incluindo opcodes (em hexadecimal)
disassemble loopdisas loopDisassemble a função loop()

Inspecionando dados

ComandoForma curtaDescrição
print $pcp $pcImprime o valor do registrador PC (contador do programa)
print $r0p $r0Imprime o valor do registrador R0
print ip iImprime o valor da variável i
print PORTBp PORTBImprime o valor de I/O do registrador PORTB
dprint loop,"Loop\n"dp …Imprime "Loop" sempre que o loop() começa
dprint loop,"%d\n",idp …Imprime o valor de i toda vez que o loop() começa
x/16b $spDespejo de 16 bytes da memória começando em $sp (ponteiro da pilha)
x/10w 0x800200Despejo de 10 dwords começando no endereço do espaço de dados 0x200
x/s 0x800151Despejo de uma string no endereço do espaço de dados 0x151
display someVardisp someVarExibe o valor de someVar sempre que o programa parar
info displayi diLista as expressões ativas de exibição automática (watch)
delete display 1d d 1Excluí a expressão de exibição automática número 1

Modificando dados

ComandoForma curtaDescrição
set i = 0s i=0Altera o valor da variável i para 0
set $pc = 0s $pc=0Salta para o início do programa
set $r12 = 0x55s $r12=0x55Define r12 como 0x55
set PORTB = 0xffs PORTB=0xffDefine o (registro de I/O) do PORTB para 0xff
set {int}0x800200 = 50s …Define um número inteiro no endereço do espaço de dados 0x200 para 50

Interface de usuário de texto (TUI)

ComandoForma curtaDescrição
tui enabletu eAtiva o modo TUI (também Ctrl X + A)
tui disabletu dDesativa o modo TUI (também Ctrl X + A)
tui reg alltu r aExibe a janela de registradores
layout asmla aMuda para a visualização em Assembly
layout srcla srMuda para a visualização do Código-fonte
layout splitla spDivide a visualização (Assembly + Código-fonte)
updateupdMostra a linha atual na janela do Código Fonte
Ctrl+LRedesenha a tela

Outros comandos

ComandoForma curtaDescrição
(empty line)Repete o comando anterior
help continueh cExibe a ajuda do comando "continue"
help breakh bExibe a ajuda do comando "break"
help breakpointsh breakpointsExibe uma lista de todos os comandos relacionados ao breakpoint
quitqSaí do GDB (no Wokwi Web GDB, o GDB será reiniciado)

Aprenda mais

Se você quiser saber como fizemos o GDB funcionar no navegador, dê uma olhada em Executando GDB no navegador. Você não precisa saber disso para usar o GDB - são apenas os detalhes sangrentos que permitem que você dê uma olhada nos bastidores.