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.