Anterior: , Subir: Invocación de guix build   [Índice general][Índice]


9.1.4 Depuración de fallos de construcción

Cuando esté definiendo un paquete nuevo (véase Definición de paquetes), probablemente se encuentre que dedicando algún tiempo a depurar y afinar la construcción hasta obtener un resultado satisfactorio. Para hacerlo, tiene que lanzar manualmente las órdenes de construcción en un entorno tan similar como sea posible al que el daemon de construcción usa.

To that end, the first thing to do is to use the --keep-failed or -K option of guix build, which will keep the failed build tree in /tmp or whatever directory you specified as TMPDIR (véase --keep-failed).

De ahí en adelante, puede usar cd para ir al árbol de la construcción fallida y cargar el archivo environment-variables, que contiene todas las definiciones de variables de entorno que existían cuando la construcción falló. Digamos que está depurando un fallo en la construcción del paquete foo; una sesión típica sería así:

$ guix build foo -K
… build fails
$ cd /tmp/guix-build-foo.drv-0
$ source ./environment-variables
$ cd foo-1.2

Ahora puede invocar órdenes (casi) como si fuese el daemon y encontrar los errores en su proceso de construcción.

A veces ocurre que, por ejemplo, las pruebas de un paquete pasan cuando las ejecuta manualmente pero fallan cuando el daemon las ejecuta. Esto puede suceder debido a que el daemon construye dentro de contenedores donde, al contrario que en nuestro entorno previo, el acceso a la red no está disponible, /bin/sh no existe, etc. (véase Configuración del entorno de construcción).

En esos casos, puede tener que inspeccionar el proceso de construcción desde un contenedor similar al creado por el daemon de construcción:

$ guix build -K foo
…
$ cd /tmp/guix-build-foo.drv-0
$ guix environment --no-grafts -C foo --ad-hoc strace gdb
[env]# source ./environment-variables
[env]# cd foo-1.2

Aquí, guix environment -C crea un contenedor y lanza un shell nuevo en él (véase Invocación de guix environment). El fragmento --ad-hoc strace gdb añade las ordenes strace y gdb al contenedor, las cuales pueden resultar útiles durante la depuración. La opción --no-grafts asegura que obtenemos exactamente el mismo entorno, con paquetes sin injertos (véase Actualizaciones de seguridad, para más información sobre los injertos).

Para acercarnos más al contenedor usado por el daemon de construcción, podemos eliminar /bin/sh:

[env]# rm /bin/sh

(No se preocupe, es inocuo: todo esto ocurre en el contenedor de usar y tirar creado por guix environment).

La orden strace probablemente no esté en la ruta de búsqueda, pero podemos ejecutar:

[env]# $GUIX_ENVIRONMENT/bin/strace -f -o log make check

De este modo, no solo habrá reproducido las variables de entorno que usa el daemon, también estará ejecutando el proceso de construcción en un contenedor similar al usado por el daemon.


Anterior: , Subir: Invocación de guix build   [Índice general][Índice]