Depurando com Delve
Delve (dlv) é o depurador padrão para Go.
Busque em todas as páginas da documentação
Delve (dlv) é o depurador padrão para Go.
Ele para um programa em execução em breakpoints, percorre o código, inspeciona goroutines e lê valores de variáveis usando informações de depuração DWARF do compilador.
Use Delve quando testes e logs não forem suficientes para explicar um estado incorreto, especialmente com concorrência, interfaces ou callbacks de terceiros.
A CLI e as integrações de IDE compartilham o mesmo backend: breakpoints, continue, next, step e listagem de goroutines.
Os modos remoto e headless se conectam a processos em contêineres ou pods Kubernetes quando você consegue reproduzir problemas fora do seu laptop.
Cartão de receita de referência rápida - pronto para copiar e colar.
# Depurar o pacote main atual
dlv debug .
# Depurar uma função de teste
dlv test . -- -test.run TestName
# Comandos REPL comuns após a interrupção
break main.main
continue
next
step
goroutines
print errQuando usar isso:
panic ocorre apenas sob carga com muitas goroutines.// example.com/demo/internal/counter/counter.go
package counter
import "sync"
type Counter struct {
mu sync.Mutex
n int
}
func (c *Counter) Inc() {
c.mu.Lock()
c.n++
c.mu.Unlock()
}
func (c *Counter) Value() int {
c.mu.Lock()
defer c.mu.Unlock()
return c.n
}// example.com/demo/internal/counter/counter_test.go
package counter
import (
"sync"
"testing"
)
func TestConcurrentInc(t *testing.T) {
var c Counter
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
defer wg.Done()
c.Inc()
}()
}
wg.Wait()
if c.Value() != 10 {
t.Fatalf("got %d", c.Value())
}
}Depure o teste com falha:
cd internal/counter
dlv test . -- -test.run TestConcurrentIncNo shell Delve:
(dlv) break counter_test.go:22
(dlv) continue
(dlv) goroutines
(dlv) goroutine 5 bt
(dlv) print c.n
O que isso demonstra:
dlv test compila binários de teste com símbolos de depuração e passa flags após -- para go test.goroutines lista pilhas concorrentes; mude com goroutine <id>.print mostra memória ao vivo, incluindo campos de struct protegidos por mutexes (observe a ordem de bloqueio).ptrace no Linux, equivalentes em outros lugares).| Comando | Propósito |
|---|---|
break / clear | Define ou remove breakpoints por local ou função |
continue / next / step | Executa, avança sobre, entra |
restart | Reinicia o processo a partir da entrada (sessão de depuração) |
goroutines | Lista goroutines com IDs e estados |
stack / bt | Backtrace para a goroutine selecionada |
print / examine | Avalia expressões no frame atual |
cond | Interrompe apenas quando a expressão for verdadeira |
dlv test ./... -- -test.run TestLeak -count=1Use -count=1 para desativar o cache de teste enquanto itera.
Para pacotes main em cmd/:
dlv debug ./cmd/apidlv debug --headless --listen=:2345 --api-version=2 --accept-multiclient .As configurações de inicialização da IDE se conectam a 127.0.0.1:2345.
No Kubernetes, faça port-forward da porta de depuração do pod; restrinja o acesso à rede, pois Delve concede inspeção de memória.
# Quando as variáveis são otimizadas
go build -gcflags="all=-N -l" -o bin/app ./cmd/app
dlv exec ./bin/app-N desabilita otimizações; -l desabilita inlining.
Use apenas para builds de depuração, não para artefatos de lançamento de produção.
print. Correção: Recompile com -gcflags="all=-N -l" para a sessão de depuração.-ldflags="-s -w" remove informações de depuração. Correção: Mantenha os símbolos em imagens de depuração/staging; remova apenas builds de lançamento nos quais você nunca se conecta.cond com estado específico da goroutine ou interrompa mais perto do branch suspeito.-race para corridas de dados; use Delve para inspeção de estado após a reprodução.dlv compilado para a libc de destino.| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
fmt.Printf / logs estruturados | Rastreamento de fluxo simples | Valores são muito grandes ou a ordem de concorrência é importante |
runtime/trace e pprof | Perfis de taxa de transferência, latência e bloqueio | Você precisa de valores exatos de variáveis locais em uma linha |
testing + testify | Prevenção de regressão | O bug requer exploração interativa |
Análise de core dump (dlv core) | Pós-mortem em processo travado | Iteração ao vivo é mais rápida localmente |
Delve entende goroutines, strings Go, interfaces e layouts de canal.
GDB trata programas Go mais como C e é problemático para depuração Go rotineira.
Sim - copie dlv para dentro do contêiner ou use um sidecar de depuração, execute em modo headless e faça port-forward.
Certifique-se de que o binário interno mantenha os símbolos DWARF.
Sim - ele depura o binário compilado.
Os caminhos de origem devem corresponder à árvore de build para que os breakpoints sejam resolvidos para os arquivos.
Defina break runtime.fatalpanic ou execute com GOTRACEBACK=crash e analise a pilha na interrupção.
Muitas equipes interrompem em sites de chamada de panic em testes.
Limitado - algumas expressões com chamadas de função funcionam; efeitos colaterais podem mutar o estado ao vivo.
Prefira print de variáveis em vez de chamadas arbitrárias.
Binários de teste mudam à medida que você edita.
Use -test.count=1 e mantenha a sessão aberta para amortizar o custo de reconstrução.
Use breakpoints condicionais com cond em expressões como n > 100.
Watchpoints completos dependem do suporte da plataforma; loops geralmente usam interrupções condicionais.
O RPC do Delve é tipicamente local ou tunelado via SSH/port-forward.
Não exponha a porta bruta à internet pública.
Parcialmente - Delve percorre frames Go de forma confiável; frames C podem precisar de depuradores de plataforma.
Mantenha os limites cgo finos para facilitar a inspeção.
Não - eles resolvem problemas diferentes.
Use -race em CI; use Delve para inspecionar o estado quando uma corrida for suspeita ou reproduzida.
dlv e os primeiros comandosVersões de Stack: Esta página foi escrita para Go 1.26.x (padrão Green Tea GC, go fix modernizers - verifique o patch na compilação), chi (última versão - verifique na compilação), gin (última versão - verifique na compilação), echo (última versão - verifique na compilação), google.golang.org/grpc (última versão - verifique na compilação), sigs.k8s.io/controller-runtime (última versão - verifique na compilação), kubebuilder (última versão - verifique na compilação), tinygo (última versão - verifique os alvos de placa na compilação), wazero (última versão - verifique na compilação) e golangci-lint (última versão - verifique o conjunto de linters na compilação).
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026