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.