GDB - Programas de depuração
Primeiros passos: começando e parando
gcc -g meuprograma.c
Compila myprogram.c com a opção de depuração (-g). Você ainda obtém um a.out, mas ele contém informações de depuração que permitem usar variáveis e nomes de funções dentro do GDB, em vez de localizações de memória bruta (não é divertido).
gdb a.out
Abre o GDB com o arquivo a.out, mas não executa o programa. Você verá um prompt (gdb) - todos os exemplos são desse prompt.
r
r arg1 arg2
r <arquivo1
Três maneiras de executar “a.out”, carregado anteriormente. Você pode executá-lo diretamente (r), passar argumentos (r arg1 arg2) ou inserir um arquivo. Normalmente, você definirá pontos de interrupção antes de executar.
help
h pontos de interrupção
Lista tópicos de ajuda (ajuda) ou obtém ajuda em um tópico específico (h pontos de interrupção). GDB está bem documentado.
q - Saia do GDB
Percorrendo o código
A revisão permite rastrear o caminho do seu programa e se concentrar no código que está travando ou retornando uma entrada inválida.
l
l 50
eu minha função
Lista 10 linhas de código-fonte para a linha atual (l), uma linha específica (l 50) ou para uma função (l myfunção).
Próximo
Executa o programa até a próxima linha e, em seguida, faz uma pausa. Se a linha atual for uma função, ela executa a função inteira e depois faz uma pausa.next é bom para percorrer seu código rapidamente.
degrau
Executa a próxima instrução, não a linha. Se a instrução atual está definindo uma variável, é o mesmo quenext. Se for uma função, ele pulará para a função, executará a primeira instrução e fará uma pausa.step é bom para mergulhar nos detalhes do seu código.
terminar
Conclui a execução da função atual e faz uma pausa (também chamada de saída). Útil se você acidentalmente entrou em uma função.
Pontos de interrupção ou pontos de controle
Os pontos de interrupção desempenham um papel importante na depuração. Eles pausam (interrompem) um programa quando ele atinge um determinado ponto. Você pode examinar e alterar variáveis e retomar a execução. Isso é útil quando ocorre alguma falha de entrada ou quando as entradas precisam ser testadas.
pausa 45
quebrar minha função
- Define um ponto de interrupção na linha 45 ou em minha função. O programa fará uma pausa quando atingir o ponto de interrupção.
assistir x == 3
Define um ponto de controle, que pausa o programa quando uma condição muda (quando x == 3 muda). Os pontos de controle são ótimos para certas entradas (myPtr! = NULL) sem ter que interromper a cada chamada de função.
continuar
Retoma a execução após ser pausado por um breakpoint / watchpoint. O programa continuará até atingir o próximo breakpoint / watchpoint.
deletar N
- Exclui o ponto de interrupção N (os pontos de interrupção são numerados quando criados).
Configurando Variáveis
Visualizar e alterar variáveis em tempo de execução é uma parte crítica da depuração. Tente fornecer entradas inválidas para funções ou executar outros casos de teste para encontrar a causa raiz dos problemas. Normalmente, você visualizará / definirá variáveis quando o programa for pausado.
imprimir x
Imprime o valor atual da variável x. Ser capaz de usar os nomes de variáveis originais é o motivo pelo qual o sinalizador (-g) é necessário; programas compilados regularmente têm essas informações removidas.
definir x = 3
definir x = y
- Define x para um valor definido (3) ou para outra variável (y)
chamar minha função ()
chamar mioterfunção (x)
chamar strlen (mystring)
Chama funções definidas pelo usuário ou do sistema. Isso é extremamente útil, mas cuidado ao chamar funções com erros.
exibir x
Exibe constantemente o valor da variável x, que é mostrado após cada passo ou pausa. Útil se você estiver verificando constantemente um determinado valor.
não mostrar x
- Remove a exibição constante de uma variável exibida pelo comando display.
Backtrace e mudança de frames
Uma pilha é uma lista das chamadas de função atuais - ela mostra onde você está no programa. Um quadro armazena os detalhes de uma única chamada de função, como os argumentos.
bt
Backtracesou imprime a pilha de funções atual para mostrar onde você está no programa atual. Se main chamar a função a (), que chama b (), que chama c (), o backtrace é
c <= current location
b
a
main
up
baixa
Passe para o próximo quadro para cima ou para baixo na pilha de funções. Se você está emc, você pode mover para b ou a para examinar as variáveis locais.
Retorna
- Retorna da função atual.
Manuseio de sinais
Os sinais são mensagens lançadas após certos eventos, como um cronômetro ou erro. GDB pode pausar quando encontra um sinal; você pode preferir ignorá-los.
lidar com [nome do sinal] [ação]
lidar com SIGUSR1 nostop
lidar com SIGUSR1 noprint
lidar com SIGUSR1 ignorar
Instrua o GDB para ignorar um certo sinal (SIGUSR1) quando ele ocorrer. Existem vários níveis de ignorar.