Vídeo Tutorial
Comandos de gdb
Iniciando o gdb
gdb meu_programa
Não se esqueça de compilar o programa com a opção -g (e sem opções de otimização como -O3)
Rodando o programa no gdb
run
Sem colocar um breakpoint, o programa irá rodar até o final. Por isso, em geral, colocamos algum breakpoint, nem que seja na função main.
Mas se tiver um segmentation fault no seu programa, você pode rodar sem breakpoint e descobrir qual linha teve problema.
Breakpoints
Os breakpoints são lugares (linhas ou funções) onde você quer que o programa pare a execução e espere por um comando seu (para imprimir variáveis, para executar uma linha por vez, etc).
Criando Breakpoints
Você pode colocar um breakpoint em uma função e a execução irá parar sempre quando a função for chamada. Exemplo:
break main
Nesse caso, o programa para logo no começo da execução.
Você também pode colocar breakpoints em linhas do seu código. Exemplo:
break 10
Nesse caso, o programa para ao chegar na linha 10.
Quando você tem vários arquivos (veremos isso no curso), você precisa especificar de qual arquivo você quer a linha. Exemplo:
break exemplo.c:10
Nesse caso, o programa para ao chegar na linha 10 do arquivo exemplo.c.
Apagando breakpoints
Quando um breakpoint é criado, ele ganha um número. Você pode apagar um breakpoint usando o seu número. Exemplo:
delete 3
Você também pode apagar todos os breakpoints com o comando:
clear
Executando passo-a-passo
A ideia do debbugger (ou depurador, em português) é permitir que você execute o programa passo-a-passo, acompanhando sua execução, enquanto também consegue ver ou alterar o valor de variáveis, chamar funções, etc.
Quando o gdb parar em um breakpoint, você poderá falar para seguir com a execução usando o comando:
continue
Nesse caso ele irá parar no próximo breakpoint que encontrar.
Se você quiser executar um comando por vez, você tem duas opções:
step
next
Ambos vão para o próximo comando, mas o next
vai sempre para a próxima linha do arquivo, enquanto que o step
entra em qualquer função que seja chamada nessa linha.
Por exemplo, imagine que você tem as seguintes linhas no seu código:
y = f(x)
w = g(k)
e que o gdb parou na linha onde y = f(x)
.
Se você der o comando next
, o gdb irá para a próxima linha (w = g(k)
), mas se você der o comando step
, ele irá para a primeira linha da função f
.
Imprimindo variáveis
Você pode imprimir o valor de qualquer variável x usando
print x
Você também pode imprimir campos de struct, posições de vetores, etc.
Se você substituit print
por display
, então aquela variável ficará sempre visível e você pode acompanhar as alterações no valor dela.
Para remover algo que está com display
, faça
undisplay n
onde n
é o número do display que você quer remover.