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(oub): Define um breakpoint em uma função ou linha específica (ex:b main.go:15).breakpoints(oubp): Lista todos os breakpoints ativos.clear: Remove um breakpoint específico.clearall: Limpa todos os pontos de interrupção.
Execução
continue(ouc): Retoma a execução até o próximo breakpoint ou fim do programa.next(oun): Avança para a próxima linha de código no mesmo escopo.step(ous): Entra dentro de uma chamada de função.stepout(ouso): Sai da função atual retornando para quem a chamou.restart(our): Reinicia o processo mantendo os breakpoints.
Inspeção de Dados
print(oup): 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(ougrs): Lista todas as goroutines em execução.goroutine [id]: Alterna o contexto para uma goroutine específica.stack(oubt): 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ívelsystem, gera um core dump do processo, permitindo análise profunda viadlv core.