viernes, noviembre 19, 2010

Buscando problemas de memoria con glib y gdb

Llevo algún tiempo participando en el desarrollo de una aplicación que utiliza las librería glib. Estas librerías tienen una gestión de memoria propia basada en mecanismo de slab allocator desarrollado por Jeff Bonwick para su uso en SunOS. La librería glib denomina a este sistema de gestión de memoria memory slices

Me estaba encontrando con un segmentation fault en diferentes rutinas de liberación o reserva de memoria, lo cual me llevó a pensar que estaba corrompiendo algún bloque de gestión de memoria. Aprovechando las facilidades de depurcación que ofrece la librería glib, que puede verse en running glib applications. Se puede controlar el comportamiento del sistema de gestión de memoria de la glib estableciendo la variable de entorno G_SLICE. Ésta permite tres valores:

  • always-malloc Si la variable de entorno tiene este valor, el sistema rutará todas las llamadas para reservar los slices que utiliza en la gestión de memoria a través de g_malloc y g_free, que se conectan directamente con las librerías del sistema. Esto puede ser util para intentar detectar memoria que no se libera o si sobreescribimos en memoria no reservada con herramientas como valgrind.
  • debug-blocks Esta opción activa las opciones de depuración y comprobación cuando se intenta liberar un slice de memoria, comprobando que las direcciones y tamaños de los slices son adecuados.
  • all Si se quieren activar las dos opciones anterioes a la vez.

Cuando me enfrenté al error tuve bastante suerte, porque al final fue un doble free que pude detectar fácilmente con el gdb:
gdb ./programa
(gdb)set enviroment G_SLICE=all
(gdb)run
.... esperar que la aplicación falle
(gdb) bt
Con el volcado de la pila que se obtiene con la orden backtrace (bt), pude ver directamente cual era el sitio donde estaba fallando el programa.


Technorati Tags: ,

sábado, noviembre 06, 2010

Desactivar el control de energía en Solaris 10

Tengo una Sun Blade 2000 que utilizo para probar ciertas cosas en Solaris. Tras instalarle la versión 10 de este sistema operativo, me empecé a encontrar un curioso kernel panic, donde la estación de trabajo acababa en la PROM del sistema tras el problema. La única pista que tenía es que en el fichero /var/log/syslog había registrado un mensaje del controlador de discos de FC-AL de este equipo, comentando que el disco había entrado en proceso de hibernación, del cual parece ser que no salía luego.

Aunque no tengo un contrato de mantenimiento con Sun, hablando con un amigo, me pasó una lista de parches para dicha máquina. Uno de los parches hace referencia al firmware que tiene los discos de FC-AL de la máquina, y no sé si lo tengo instalado.

Sin embargo, sabiendo que el problema está relacionado con la gestión de energía, decidí desactivarla del sistema. El daemon en Solaris encargado de la gestión es powerd, el fichero de configuración del mismo es /etc/power.conf y el programa que se encarga de notificar a powerd que ha existido un cambio de configuración en el sistema es pmconfig.

Desactivar la gestión de energía es sencillo: Basta con poner la siguiente línea en en el fichero /etc/power.conf y posteriormente, ejecutar el programa pmconfig para que el daemon encargado de la gestión de energía vuelva a leer el fichero con la nueva configuración:

autopm     disable

Tras este cambio de configuración no he vuelto a tener ningún problema con Solaris 10 en este equipo.


Technorati Tags: