DWARF es un formato de datos de depuración estandarizado y ampliamente utilizado . Originalmente, DWARF se diseñó junto con el formato ejecutable y enlazable (ELF), aunque es independiente de los formatos de archivos objeto . [ 1 ] El nombre es un complemento de fantasía medieval a "ELF" que no tenía un significado oficial, aunque posteriormente se propuso el nombre "Debugging With Arbitrary Record Formats" como acrónimo inverso . [ 1 ]
DWARF se originó con el compilador C y el depurador sdb en Unix System V Release 4 (SVR4). [ 1 ] La información de depuración, como la que está en formato DWARF, se emite cuando -gse usa la opción del compilador. [ 2 ]
Historia
La primera versión de DWARF resultó consumir una cantidad excesiva de almacenamiento, por lo que una versión sucesora incompatible, DWARF-2, la reemplazó e incorporó diversos esquemas de codificación para reducir el tamaño de los datos. DWARF no obtuvo una aceptación universal inmediata; por ejemplo, cuando Sun Microsystems adoptó ELF como parte de su migración a Solaris , optó por seguir utilizando stabs , en una incrustación conocida como "stabs-in-elf". Linux siguió el ejemplo, y DWARF-2 no se convirtió en el estándar hasta finales de la década de 1990.
El Grupo de Trabajo DWARF del Grupo de Estándares Libres publicó la versión 3 de DWARF en enero de 2006, [ 3 ] añadiendo (entre otras cosas) soporte para espacios de nombres de C++ , datos asignables de Fortran 90 y técnicas adicionales de optimización del compilador .
El comité DWARF publicó la versión 4 de DWARF, que ofrece "una compresión de datos mejorada, una mejor descripción del código optimizado y soporte para nuevas características del lenguaje en C++", en 2010. [ 4 ]
La versión 5 del formato DWARF se publicó en febrero de 2017. [ 5 ] [ 6 ] "incorpora mejoras en muchas áreas: mejor compresión de datos, separación de los datos de depuración de los archivos ejecutables, descripción mejorada de macros y archivos fuente, búsqueda más rápida de símbolos, depuración mejorada de código optimizado, así como numerosas mejoras en la funcionalidad y el rendimiento."
Estructura
En los archivos objeto (incluidos los ejecutables), DWARF se almacena como una serie de secciones llamadas .debug_info, .debug_frame, etc., cada una con un propósito diferente. [ 7 ]
DWARF utiliza una estructura de datos denominada Entrada de Información de Depuración (DIE) para representar cada variable, tipo, procedimiento, etc. Una DIE tiene una etiqueta (por ejemplo, DW_TAG_variable , DW_TAG_pointer_type , DW_TAG_subprogram ) y atributos (pares clave-valor). Una DIE puede tener DIE anidadas (hijas), formando una estructura de árbol . Un atributo de DIE puede hacer referencia a otra DIE en cualquier parte del árbol; por ejemplo, una DIE que representa una variable tendría una entrada DW_AT_type que apunta a la DIE que describe el tipo de la variable; esta es una referencia "local". DIE también permite hacer referencia a cualquier otra entrada de DWARF (incluso una que esté en una sección .debug_info diferente ), o hacer referencia a una entrada en el bloque común por su nombre.
DWARF incluye una codificación para expresiones aritméticas arbitrarias, un código de bytes para una máquina de pila de expresiones DWARF especializada . Esta expresión se usa comúnmente para describir la ubicación de un objeto inmóvil en la memoria ( ). La otra forma de describir la ubicación es usar una lista de ubicaciones , que se usa principalmente para objetos con direcciones variables (por ejemplo, asignadas dinámicamente). [ 9 ]DW_AT_location.debug_loclist
.debug_line(y .debug_line_str) contienen información de números de línea, que es altamente redundante pero no se puede comprimir fácilmente con métodos regulares. DWARF aborda este problema definiendo otro formato de código de bytes que define una máquina de estados finitos simple y de propósito especial . Cuando se ejecuta la FSM incorporada en dicho programa de números de línea , produce la tabla completa de números de línea. [ 10 ]
Gran parte del tamaño excesivo en DWARF se debe a información duplicada, por ejemplo, a numerosas inclusiones de encabezados complejos en C y C++. El desarrollador de DWARF debe tener cuidado de utilizar las funciones de referencia en DIE, por ejemplo, organizando el código en unidades de compilación y los tipos en unidades de tipo que se puedan desduplicar y referenciar fácilmente. También puede ser conveniente asignar a cada archivo de encabezado su propia unidad. [ 11 ]
Adopción
DUENDE
En el formato ELF , los datos DWARF se almacenan principalmente con los nombres de sección estándar que comienzan con .debugen el mismo archivo que el código ejecutable .text. Una alternativa es crear un archivo ELF separado sin código que contenga solo la información de depuración ("símbolos"), de modo que los datos DWARF se puedan instalar y cargar solo cuando sea necesario. [ 12 ] debuginfod es un programa para recuperar secciones almacenadas en archivos separados. [ 13 ]
Además de almacenar ingenuamente como secciones ELF, muchas herramientas también admiten una variante en la que las secciones DWARF se comprimen, descomprimiéndolas según sea necesario. El antiguo estilo GNU renombra todas las secciones de "debug" a "zdebug"; la sección contiene un encabezado que describe el método de compresión (normalmente zlib) y el tamaño original. El nuevo estilo gABI estándar añade una ELF_COMPRESSEDbandera a las banderas de sección, lo que permite que la mayoría de las secciones ELF utilicen esta característica. [ 14 ] A pesar de los ingeniosos esquemas de codificación integrados en DWARF, los datos DWARF siguen siendo altamente compresibles. [ 15 ]
La compatibilidad con la versión DWARF depende de la combinación de compilador y depurador, pero en la mayoría de los casos se utiliza DWARF 5.
Macho
El formato Mach-O utilizado por macOS admite stabs y DWARF. El formato stabs, que incrusta directamente información de depuración en la tabla de símbolos LC_SYMTAB, todavía se usa activamente en contextos de desarrollo donde se almacena directamente con el código. Aunque técnicamente también es posible almacenar los datos DWARF con el código, las herramientas del sistema generalmente esperan que los datos de depuración se proporcionen en archivos de objeto "dSYM" separados y sin código. [ 16 ] Dichos archivos de objeto solo contienen un segmento "__DWARF", debajo del cual hay secciones etiquetadas como "__debug_info", etc., que corresponden a las secciones DWARF estándar. [ 17 ]
La versión de DWARF es 4 o 5, dependiendo de la versión del sistema operativo. Las herramientas oficiales no utilizan ni comprenden la información de depuración comprimida.
Herramientas
Libdwarf es una biblioteca que proporciona acceso a la información de depuración de DWARF en archivos ejecutables y archivos objeto. [ 18 ]
elfutils contiene herramientas para manipular secciones ELF, por ejemplo, para fusionar información de depuración en un archivo o para dividirla en un archivo diferente.
Lecturas adicionales
Michael Eager, presidente del Comité de Estándares DWARF, ha escrito una introducción a los formatos de depuración y a DWARF 3, Introducción al formato de depuración DWARF . [ 1 ]
Referencias
- 1 2 3 4 Michael J. Eager (abril de 2012). "Introducción al formato de depuración DWARF" (PDF) . Recuperado el 8 de enero de 2015 .
- ↑ "Opciones de depuración (Uso de la colección de compiladores GNU (GCC))" . gcc.gnu.org .
- ↑ "Se publica el estándar DWARF versión 3" (Comunicado de prensa). Free Standards Group. 4 de enero de 2006. Archivado del original el 25 de julio de 2011. Consultado el 25 de junio de 2007 .
- ↑ "Lanzamiento de la versión 4 de DWARF" . El comité de DWARF. 16 de junio de 2010. Archivado del original el 30 de julio de 2020. Consultado el 24 de junio de 2010 .
- ↑ "Se publica el estándar DWARF versión 5" . El comité DWARF. 15 de febrero de 2017. Consultado el 7 de agosto de 2017 .
- ↑ "Estándar DWARF 5" . El comité DWARF. 15 de febrero de 2017. Consultado el 7 de agosto de 2017 .
- ↑ "Explorando la información del formato de depuración de DWARF" .
- ↑ You, Ilsun; Youn, Taek-Young (3 de febrero de 2023). Aplicaciones de seguridad de la información: 23.ª Conferencia Internacional, WISA 2022, Isla de Jeju, Corea del Sur, 24-26 de agosto de 2022, Artículos seleccionados revisados . Springer Nature. ISBN 978-3-031-25659-2.
- ↑ DWARF v5, sección 2.6
- ↑ DWARF v5, sección 6.2
- ↑ DWARF v5, sección 2.6
- ↑ "Extensiones enanas" . gcc.gnu.org .
- ↑ "Recuperación de secciones ELF con debuginfod" . www.redhat.com . Consultado el 25 de septiembre de 2023 .
- ↑ Bahrami, Ali. "Compresión de sección ELF | solaris" . blogs.oracle.com .
- ↑ "Secciones de depuración comprimidas" . MaskRay . 23 de enero de 2022.
- ↑ Steele, Aidan (8 de julio de 2026). "aidansteele/osx-abi-macho-file-format-reference" .
- ↑ " Entendiendo la información de depuración de Apple - Keith Smiley" . www.smileykeith.com
- ↑ "libdwarf: Una interfaz de biblioteca de consumo para DWARF" . www.prevanders.net . Consultado el 6 de diciembre de 2023 .
Enlaces externos
- Sitio web oficial
- Libdwarf , una biblioteca C destinada a simplificar la lectura (y escritura) de aplicaciones que utilizan DWARF2 y DWARF3.
- elfutils , otra biblioteca C para el procesamiento de archivos ELF/DWARF.
- Cómo funcionan los depuradores : Parte 3 - Información de depuración
- Formatos de depuración DWARF y STAB
- Depuración de formatos de datos