DWARF
# DWARF

DWARF es un formato de datos de depuración estandarizado ampliamente utilizado. DWARF fue diseñado originalmente junto con Executable and Linkable Format (ELF), aunque es independiente de formatos de fichero objeto. El nombre es un complemento de fantasía medieval a "ELF" (en inglés dwarf es "enano" y elf es "elfo") que no tiene un significado oficial, aunque posteriormente se propuso el retroacrónimo 'Debugging With Attributed Record Formats'.

## Historia

La primera versión de DWARF probó usar cantidades excesivas de almacenamiento, y un sucesor incompatible, DWARF-2, lo reemplazó y agregó varios esquemas de codificación para reducir el tamaño de los datos. DWARF no obtuvo aceptación inmediata; por ejemplo, cuando Sun Microsystems adoptó ELF como parte de su mudanza a Solaris, optó por seguir utilizando stabs, en una incrustación conocida como "stabs-in-elf". Linux hizo lo mismo, y DWARF-2 no se convirtió en el predeterminado hasta finales de la década de 1990.

El DWARF Workgroup del Free Standards Group lanzó DWARF versión 3 en enero de 2006, agregando (entre otras cosas) soporte para namespaces de C++, datos asignables de Fortran 90 y técnicas de optimización de compilador adicionales.

El comité de DWARF publicó la versión 4 de DWARF, que ofrece "compresión de datos mejorada, mejor descripción del código optimizado y soporte para nuevas funciones de lenguaje en C++", en 2010.

La versión 5 del formato DWARF se publicó en febrero de 2017. "Incorpora mejoras en muchas áreas: mejor compresión de datos, separación entre datos de depuración y archivos ejecutables, descripción mejorada de macros y archivos fuente, búsqueda más rápida de símbolos, depuración mejorada del código optimizado, así como numerosas mejoras en funcionalidad y rendimiento".

## Estructura

DWARF utiliza una estructura de datos llamada Debugging Information Entry (DIE) para representar cada variable, tipo, procedimiento, etc. Un DIE tiene una etiqueta (por ejemplo, DW_TAG_variable, DW_TAG_pointer_type, DW_TAG_subprogram) y atributos (pares clave-valor). Un DIE puede tener DIEs anidados (hijos), formando una estructura de árbol. Un atributo DIE puede referirse a otro DIE en cualquier parte del árbol; por ejemplo, un DIE que represente una variable tendrá una entrada DW_AT_type apuntando al DIE que describa el tipo de la variable.

Para ahorrar espacio, dos grandes tablas necesarias para los depuradores simbólicos son representadas como instrucciones bytecode para máquinas de estado finito simples, de propósito especial. La tabla Line Number Table, que asigna ubicaciones de código a ubicaciones de código fuente y viceversa, también especifica qué instrucciones son parte de prólogos de funciones y epílogos. La tabla Call Frame Information permite a los depuradores localizar frames en la pila de llamadas.

## Otras lecturas

Michael Eager, presidente del DWARF Standards Committee, ha escrito una introducción a los formatos de depuración y DWARF 3, Introduction to the DWARF Debugging Format.

