debugging - significado - que es un debug y para que sirve
¿Cómo depuro un programa escrito en el idioma Go? (8)
¿Cómo depuro un programa Go? He estado usando el IDE de Gedit Go , pero no tiene depuración. ¿Hay alguna forma de pasar por mi código e inspeccionar la memoria? ¿O estoy atascado con las declaraciones impresas? ¿Puedo usar OutputDebugString ?
Es desafortunado, pero la mejor manera ahora es utilizar las funciones de impresión. La impresión y la impresión incorporadas funcionarán, pero las funciones de fmt a veces funcionarán mejor dependiendo de la información que está buscando.
Hay un paquete de depuración experimental llamado ogle . No estoy seguro de qué tan bien funciona.
Otra iniciativa para ir a la sesión de depuración: hopwatch
A diferencia de la mayoría de los depuradores, hopwatch requiere que inserte llamadas de función en puntos de interés de su programa. En estas ubicaciones de programa, puede indicarle a Hopwatch que muestre los valores de las variables y suspenda el programa (o la rutina).
Hopwatch usa Websockets para intercambiar comandos entre su programa y el depurador que se ejecuta en una página HTML5.
(Por lo tanto, sigue siendo similar a "print statement" pero con una forma más elegante de ver el resultado sin contaminar stdout
y stderr
)
Cuando su programa llama a la función Break, envía información de depuración a la página del navegador y espera la interacción del usuario.
Usando las funcionesDisplay
,Printf
oDump
(go-spew
), puede registrar información en la página del navegador.
En la página de hopwatch, el desarrollador puede ver la información de depuración y elegir reanudar la ejecución del programa.
Se está desarrollando otra técnica de depuración (cuarto trimestre de 2014): Go Execution Tracer
La huella contiene
- eventos relacionados con la programación de goroutine :
- un goroutine comienza a ejecutar en un procesador,
- un bloque de goroutine en una primitiva de sincronización,
- un goroutine crea o desbloquea otro goroutine;
- eventos relacionados con la red :
- un goroutine bloquea en la red IO,
- una goroutine está desbloqueada en la red IO;
- eventos relacionados con syscalls :
- un goroutine entra en syscall,
- un goroutine regresa de syscall;
- eventos relacionados con el recolector de basura :
- Inicio / parada de GC
- inicio / detención de barrido concurrente; y
- eventos de usuario .
Por "procesador" me refiero a un procesador lógico, unidad de
GOMAXPROCS
.
Cada evento contiene id. De evento, una marca de tiempo precisa, id. De subproceso del sistema operativo, id del procesador, ID de goroutine, rastreo de pila y otra información relevante (p. Ej. Id. De goroutine desbloqueada).
Tal vez algunas instrucciones paso a paso para comenzar con GDB ayuden.
Creé tonto.go que contiene:
package main
import "fmt"
func x() {
foo := 5
fmt.Printf("foo: %v/n", foo)
}
func main() {
go x()
fmt.Printf("Done./n")
}
Después de ejecutar 8g silly.go
y 8l -o silly silly.8
, puedo ejecutar gdb silly
. (Tengo "GNU gdb (Ubuntu / Linaro 7.2-1ubuntu11) 7.2" que, por lo que sé, viene con Ubuntu 11.04 de 32 bits).
Luego puedo escribir la list
, b 7
(abreviatura de la break 7
) y run
. Se detiene en la línea 7 y puedo ejecutar:
(gdb) p foo
$1 = 5
Sería interesante ver si el depurador Eclipse / CDT y / o DDD funcionarían con Go.
GDB 7.5 es oficialmente compatible con Go.
Actualización : ahora hay una página oficial en los documentos sobre el código de depuración de Going con GDB . Mucho ha cambiado desde que se escribió esta respuesta, y varias de las limitaciones enumeradas a continuación han sido eliminadas. Dejo el resto de esta respuesta para la posteridad, pero si quieres depurar el código Go, sigue el enlace de arriba.
Los enlazadores Go ahora emiten símbolos de depuración DWARF que pueden ser interpretados por gdb versión 7.x.
Resalte de la entrada del blog vinculada arriba:
Usted puede...
- cargar un programa Go en GDB versión 7.x
- enumere todos los archivos de origen Go, C y de ensamblaje por línea (las partes del tiempo de ejecución Go se escriben en C y ensamblaje),
- establecer puntos de interrupción por línea y recorrer el código,
- imprime los rastros de la pila e inspecciona los marcos de la pila, y
- encuentre las direcciones e imprima el contenido de la mayoría de las variables.
Todavía hay algunos inconvenientes:
- El código DWARF emitido es ilegible por la versión 6.x de GDB que se envía con Mac OS X. Con mucho gusto aceptaremos parches para hacer que la salida DWARF sea compatible con el estándar OS X GDB, pero hasta que no se solucione, deberá descargar y construir , e instale GDB 7.x para usarlo bajo OS X. La fuente se puede encontrar en http://sourceware.org/gdb/download/ . Debido a las particularidades de OS X, necesitará instalar el binario en un sistema de archivos local con chgrp procmod y chmod g + s.
- Los nombres se califican con un nombre de paquete y, como GDB no comprende los paquetes de Go, debe hacer referencia a cada elemento por su nombre completo. Por ejemplo, la variable llamada v en el paquete principal debe denominarse ''main.v'', en comillas simples. Una consecuencia de esto es que la finalización de tabulación de nombres de variables y funciones no funciona.
- La información del alcance léxico está algo ofuscada. Si hay varias variables del mismo nombre, la enésima instancia tendrá un sufijo de la forma ''#n''. Planeamos solucionar esto, pero requerirá algunos cambios en los datos intercambiados entre el compilador y el enlazador.
- Las variables de corte y cadena se representan como su estructura subyacente en la biblioteca de tiempo de ejecución. Se verán algo así como {data = 0x2aaaaab3e320, len = 1, cap = 1}. Para las divisiones, debe desreferenciar el puntero de datos para inspeccionar los elementos.
Algunas cosas no funcionan:
- Las variables de canal, función, interfaz y mapa no se pueden inspeccionar.
- Solo las variables Go se anotan con información de tipo; las variables C del tiempo de ejecución no lo son.
- Los binarios de Windows y ARM no contienen información de depuración de DWARF y, como tales, no se pueden inspeccionar con GDB.
Nueva iniciativa (comenzó en mayo de 2014): derekparker/delve
Delve es un depurador Go, escrito en Go .
(principalmente para Linux, viene soporte de OsX, soporte de Windowsdesconocidoapoyado en 2016 )
Caracteristicas
- Adjuntar a un proceso ya en ejecución
- Inicie un proceso y comience la sesión de depuración
- Establecer puntos de interrupción, paso único, paso sobre las funciones, imprimir contenidos variables
Uso
El depurador se puede iniciar de tres maneras:
Compilar, ejecutar y adjuntar en un solo paso:
$ dlv -run
Proporcione el nombre del programa que desea depurar, y el depurador lo lanzará por usted.
$ dlv -proc path/to/program
Proporcione el pid de un proceso actualmente en ejecución, y el depurador se adjuntará y comenzará la sesión.
$ sudo dlv -pid 44839
Puntos de ruptura
Delve puede insertar puntos de interrupción mediante el comando breakpoint una vez dentro de una sesión de depuración; sin embargo, para facilitar la depuración, también puede llamar a
runtime.Breakpoint()
y Delve manejará el punto de interrupción y detendrá el programa en la siguiente línea de origen.