Técnicas de Depuração em Go com Delve e GDB

O ecossistema da linguagem Go oferece suporte a diversos depuradores, como GDB, LLDB e Delve. Embora o GDB tenha sido o primeiro a ser suportado, o Delve consolidou-se como a ferramenta padrão da indústria para Go. Isso ocorre porque o Delve foi construído especificamente para entender as particularidades do runtime do Go, suas estruturas de dados complexas e o modelo de concorrência baseado em goroutines, superando as limitações do GDB nessas áreas.

Preparação do Binário para Depuração

Para garantir que o depurador consiga mapear corretamente as variáveis e os endereços de memória para o código-fonte, é fundamental desativar as otimizações e o inlining do compilador. Caso contrário, você poderá encontrar erros como "No symbol in current context" ou falhas ao tentar definir breakpoints.

A partir da versão 1.10 do Go, utilize o seguinte comando para compilar:

go build -gcflags="all=-N -l" meu_programa.go

Para versões anteriores à 1.10:

go build -gcflags="-N -l" meu_programa.go

Explicação dos parâmetros:

  • -N: Desabilita as otimizações de código.
  • -l: Evita que o compilador realize o inlining de funções (substituição da chamada da função pelo corpo da mesma).

Depuração com GDB

O GDB exige um script de extensão para lidar com tipos específicos do Go. Este script costuma ser o runtime-gdb.py. É importante notar que o GDB possui dificuldades para exibir o conteúdo detalhado de maps do Go, mostrando apenas a estrutura interna de baixo nível.

Para configurar o carregamento automático, adicione o caminho do script ao seu arquivo ~/.gdbinit:

# Exemplo de configuração no .gdbinit
add-auto-load-safe-path /usr/local/go/src/runtime/runtime-gdb.py

Uso do Delve (dlv)

O Delve é a ferramenta recomendada para a maioria dos cenários de desenvolvimento em Go.

Instalação

Para versões modernas do Go (1.16+):

go install github.com/go-delve/delve/cmd/dlv@latest

Comandos de Inicialização do Delve

Comando Descrição
dlv debug Compila o pacote atual no diretório e inicia a sessão de depuração.
dlv exec ./binario Executa e anexa o depurador a um arquivo binário já compilado.
dlv attach [pid] Anexa o depurador a um processo Go que já está em execução.
dlv test Inicia a depuração de testes unitários no pacote atual.
dlv core [bin] [core] Analisa um arquivo de coredump para depuração post-mortem.

Controle de Fluxo e Enspeção

Uma vez iinciada a sessão do Delve, utilize os comandos abaixo para navegar pelo código:

Gestão de Pontos de Interrupção (Breakpoints)

  • break (ou b): Define um breakpoint em uma função ou linha específica (ex: b main.go:15).
  • breakpoints (ou bp): Lista todos os breakpoints ativos.
  • clear: Remove um breakpoint específico.
  • clearall: Limpa todos os pontos de interrupção.

Execução

  • continue (ou c): Retoma a execução até o próximo breakpoint ou fim do programa.
  • next (ou n): Avança para a próxima linha de código no mesmo escopo.
  • step (ou s): Entra dentro de uma chamada de função.
  • stepout (ou so): Sai da função atual retornando para quem a chamou.
  • restart (ou r): Reinicia o processo mantendo os breakpoints.

Inspeção de Dados

  • print (ou p): Avalia e exibe o valor de uma expressão ou variável.
  • locals: Lista todas as variáveis locais da função atual.
  • args: Mostra os argumentos recebidos pela função atual.
  • whatis: Informa o tipo de dado de uma variável.
  • display: Define uma variável para ser exibida automaticamente a cada passo.

Concorrência e Pilha

  • goroutines (ou grs): Lista todas as goroutines em execução.
  • goroutine [id]: Alterna o contexto para uma goroutine específica.
  • stack (ou bt): Exibe o rastreamento da pilha de chamadas (stack trace).

Configuração do GOTRACEBACK

O runtime do Go utiliza a variável de ambiente GOTRACEBACK para determinar o nível de detalhamento das informações exibidas em caso de panic. Isso é crucial para gerar dumps que podem ser analisados posteriormente.

  • none: Não exibe stack traces.
  • single: (Padrão) Exibe apenas o stack trace da goroutine que causou o pânico.
  • all: Mostra stack traces de todas as goroutines criadas pelo usuário.
  • system: Inclui goroutines do runtime e do sistema.
  • crash: Além do nível system, gera um core dump do processo, permitindo análise profunda via dlv core.

Tags: go Delve gdb debugging software-testing

Publicado em 6-30 04:00