5 de agosto de 2012

Mejorando el volcado de pilas

Una de las mejoras más sencillas y a la vez importantes que se desarrolló en Linux durante la versión 2.5 fue la característica llamada "kksymoops". Hasta entonces, cuando ocurría un "oops" y se hacía un volcado de pila con la lista de funciones que se había ido llamando en cadena hasta llegar al fallo, lo que se imprimía en pantalla no eran el nombre de las funciones, sino su dirección de memoria.

Como las direcciones de memoria varían de un kernel a otro, un volcado de pila con direcciones de memoria era inservible para los desarrolladores. Había que traducir las direcciones a funciones, tarea que hacía el programa ksymoops a partir del archivo System.map del kernel correspondiente, o lo hacía por ti el ya desaparecido demonio klogd si la máquina no se colgaba del todo. Para quienes reportaban bugs esto era un engorro considerable, ya que a menudo tocaba copiar a mano (las cámaras digitales no se habían popularizado) el texto de la pantalla para luego escribirlo en un archivo que ksymoops pudiera leer (algo que era difícil de hacer si no podías arrancar el sistema para ejecutar dicho programa). Para reportar un simple fallo había que molestarse demasiado, y había que explicar a los usuarios novatos vía email como usar el programa ksymoops, etc.

kksymoops, que fue enviado por Ingo Molnar, consistía básicamente en meter el System.map dentro del kernel, qué este podía usar para, en cada oops, traducir direcciones a nombres de funciones. Así, bastaba copiar la lista de funciones para saber qué parte del kernel había causado el problema. El programa ksymoops (y el demonio klogd) se volvieron obsoletos, y reportar fallos en el kernel se simplificó enormemente. El único inconveniente es que hay que emplear unos pocos cientos de KB de RAM en almacenar una tabla de símbolos que rara vez se llega a usar, pero es una minucia y la mayoría de la gente ni tan siquiera es consciente de su existencia.

Esta historieta de tiempos remotos viene a cuento por los volcados de pila de los programas normales de espacio de usuario. Ninguna distro importante compila hoy sus paquetes con la información de depuración activada por defecto, porque el tamaño de los paquetes y las instalaciones aumentaría brutalmente. De modo que el mundo de espacio de usuario está un poco como el kernel en días antiguos, con volcados de pila que son listas de direcciones de memoria poco útiles. Aunque las distros modernas proporcionan paquetes de depuración de instalación opcional pero sencilla, e incluso existen mecanismos de reporte de bugs (abrt) que descargan esos paquetes y crean volcados de pila legibles automáticamente.

Pues bien, todo esto va a cambiar. Un tipo que trabaja para Red Hat ha desarrollado una herramienta que comprime la información de depuración de los ejecutables, lo cual permite reducir su tamaño considerablemente. A pesar de esto sigue siendo un tamaño considerable, pero si además de comprimir se elimina la información de depuración excesiva y se deja tan sólo la necesaria para decodificar nombres de funciones, resulta que una distro puede incluir esta información de depuración básica y comprimida con un coste de espacio aceptable, y de ese modo tener mejores reportes de bug (tanto para la distro como para upstream). Esto será lo que haga Fedora 18, que ya está recompilando todos sus paquetes para compilarlos con esta información.

No hace falta mencionar que esto será utilísimo no sólo para tener mejores volcados de pila, sino para herramientas de análisis del sistema, como por ejemplo perf top.

No hay comentarios:

Publicar un comentario en la entrada