Depuración con Delve
Delve (dlv) es el depurador estándar para Go.
Busca en todas las páginas de la documentación
Delve (dlv) es el depurador estándar para Go.
Detiene un programa en ejecución en puntos de interrupción, avanza paso a paso por el código, inspecciona goroutines y lee valores de variables utilizando información de depuración DWARF del compilador.
Usa Delve cuando las pruebas y los registros no sean suficientes para explicar un estado incorrecto, especialmente con concurrencia, interfaces o callbacks de terceros.
La CLI y las integraciones de IDE comparten el mismo backend: puntos de interrupción, continuar, siguiente, paso y listado de goroutines.
Los modos remoto y sin cabeza se conectan a procesos en contenedores o pods de Kubernetes cuando puedes reproducir problemas fuera de tu portátil.
Tarjeta de referencia rápida - lista para copiar y pegar.
# Depurar el paquete principal actual
dlv debug .
# Depurar una función de prueba
dlv test . -- -test.run TestName
# Comandos REPL comunes después de una interrupción
break main.main
continue
next
step
goroutines
print errCuándo usar esto:
// 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())
}
}Depura la prueba fallida:
cd internal/counter
dlv test . -- -test.run TestConcurrentIncEn el shell de Delve:
(dlv) break counter_test.go:22
(dlv) continue
(dlv) goroutines
(dlv) goroutine 5 bt
(dlv) print c.n
Lo que esto demuestra:
dlv test compila binarios de prueba con símbolos de depuración y pasa indicadores después de -- a go test.goroutines lista pilas concurrentes; cambia con goroutine <id>.print muestra memoria en vivo, incluidos los campos de struct detrás de los mutex (ten en cuenta el orden de bloqueo).ptrace en Linux, equivalentes en otros lugares).| Comando | Propósito |
|---|---|
break / clear | Establece o elimina puntos de interrupción por ubicación o función |
continue / next / step | Ejecutar, avanzar sobre, entrar |
restart | Reinicia el proceso desde la entrada (sesión de depuración) |
goroutines | Lista goroutines con IDs y estados |
stack / bt | Backtrace para la goroutine seleccionada |
print / examine | Evalúa expresiones en el marco actual |
cond | Interrumpe solo cuando la expresión es verdadera |
maindlv test ./... -- -test.run TestLeak -count=1Usa -count=1 para deshabilitar la caché de pruebas mientras iteras.
Para paquetes main en cmd/:
dlv debug ./cmd/apidlv debug --headless --listen=:2345 --api-version=2 --accept-multiclient .Las configuraciones de lanzamiento de IDE se conectan a 127.0.0.1:2345.
En Kubernetes, reenvía el puerto de depuración del pod; restringe el acceso a la red porque Delve otorga inspección de memoria.
# Cuando las variables se optimizan
go build -gcflags="all=-N -l" -o bin/app ./cmd/app
dlv exec ./bin/app-N deshabilita las optimizaciones; -l deshabilita la inlining.
Úsalo solo para compilaciones de depuración, no para artefactos de lanzamiento de producción.
print. Solución: Recompila con -gcflags="all=-N -l" para la sesión de depuración.-ldflags="-s -w" elimina la información de depuración. Solución: Conserva los símbolos en imágenes de depuración/staging; elimina solo las compilaciones de lanzamiento a las que nunca te conectas.cond con estado específico de goroutine o interrumpe más cerca de la rama sospechosa.-race para carreras de datos; usa Delve para la inspección de estado después de la reproducción.dlv compilado para la libc de destino.| Alternativa | Usar cuando | No usar cuando |
|---|---|---|
fmt.Printf / registros estructurados | Trazado de flujo simple | Los valores son demasiado grandes o el orden de concurrencia importa |
runtime/trace y pprof | Perfiles de rendimiento, latencia, bloqueo | Necesitas valores exactos de variables locales en una línea |
testing + testify | Prevención de regresiones | El error necesita exploración interactiva |
Análisis de volcados de núcleo (dlv core) | Post-mortem de un proceso fallido | La iteración en vivo es más rápida localmente |
Delve entiende goroutines, strings de Go, interfaces y diseños de canales.
GDB trata los programas Go más como C y es doloroso para la depuración rutinaria de Go.
Sí: copia dlv en el contenedor o usa un sidecar de depuración, ejecuta sin cabeza y reenvía el puerto.
Asegúrate de que el binario interno conserve los símbolos DWARF.
Sí: depura el binario compilado.
Las rutas de origen deben coincidir con el árbol de compilación para que los puntos de interrupción se resuelvan en archivos.
Establece break runtime.fatalpanic o ejecuta con GOTRACEBACK=crash y analiza la pila en la interrupción.
Muchos equipos se detienen en los sitios de llamada panic en las pruebas en su lugar.
Limitado: algunas expresiones con llamadas a funciones funcionan; los efectos secundarios pueden mutar el estado en vivo.
Prefiere print de variables sobre llamadas arbitrarias.
Los binarios de prueba cambian a medida que editas.
Usa -test.count=1 y mantén la sesión abierta para amortizar el costo de la recompilación.
Usa puntos de interrupción condicionales con cond en expresiones como n > 100.
Los puntos de vigilancia completos dependen del soporte de la plataforma; los bucles a menudo usan interrupciones condicionales.
La RPC de Delve suele ser local o se tuneliza a través de SSH/reenvío de puertos.
No expongas el puerto sin procesar a Internet público.
Parcialmente: Delve avanza por los marcos de Go de manera confiable; los marcos de C pueden necesitar depuradores de plataforma.
Mantén los límites de cgo delgados para una inspección más fácil.
No, resuelven problemas diferentes.
Usa -race en CI; usa Delve para inspeccionar el estado una vez que se sospecha o se reproduce una carrera.
dlv y los primeros comandosVersiones de pila: Esta página fue escrita para Go 1.26.x (predeterminado de GC de Green Tea, go fix modernizadores - verifica el parche en la compilación), chi (última versión - verifica en la compilación), gin (última versión - verifica en la compilación), echo (última versión - verifica en la compilación), google.golang.org/grpc (última versión - verifica en la compilación), sigs.k8s.io/controller-runtime (última versión - verifica en la compilación), kubebuilder (última versión - verifica en la compilación), tinygo (última versión - verifica los objetivos de la placa en la compilación), wazero (última versión - verifica en la compilación) y golangci-lint (última versión - verifica el conjunto de linters en la compilación).
Revisado por Chris St. John·Última actualización: 16 jul 2026