La información de depuración describe la correspondencia entre elementos del código fuente , como los nombres de variables y rutinas, y entidades del código objeto , que se encuentra en un archivo objeto , como una biblioteca compartida o un ejecutable . Este tipo de información permite que un depurador simbólico proporcione una experiencia de depuración más fiel al código fuente.
La información de depuración puede compilarse junto con el archivo binario del módulo , distribuirse en un archivo separado o simplemente descartarse durante la compilación y/o el enlace .
Históricamente, esta información se asociaba con la tabla de símbolos (que originalmente se utilizaba para traducir los nombres de identificadores exportados a ubicaciones en el archivo objeto), por lo que también se la conocía comúnmente como símbolos de depuración . Sin embargo, hoy en día la mayor parte de la información de depuración se encuentra fuera de la tabla de símbolos, lo que convierte este término en una denominación errónea.
Esta información puede ser útil al intentar investigar y solucionar una aplicación que falla o cualquier otro problema. [ 1 ] También se utilizan para proporcionar una vista de la estructura del programa al realizar ingeniería inversa .
Información de depuración
Los símbolos de depuración se pueden dividir en varios niveles:
- La información suele proporcionarse mediante la tabla de símbolos , que traduce nombres a direcciones. En el caso de las bibliotecas dinámicas, la tabla de símbolos debe incluir las funciones de ubicación y las variables globales que se espera que utilicen otros programas, ya que, de lo contrario, estas "exportaciones" simplemente no estarían disponibles.
- Información necesaria para otras características como la introspección de tipos (incluida la información de tipos en tiempo de ejecución ) y la reflexión .
- Información adicional opcional, que puede incluir:
- Archivo de código fuente en el que aparece el símbolo, así como el número de línea en el que se define.
- Tipo de datos y tamaño de un símbolo.
- Para tipos personalizados como estructuras y clases, sus nombres, métodos y miembros.
- Símbolos locales, generalmente una asignación de un nombre de variable a un registro o ubicación de memoria, y su tiempo de vida y alcance ( alcance de bloque o alcance global ).
- Información sobre marcos de excepción.
- El código fuente en sí (que se encuentra en DWARF 5 y ADATA de § OS/390 y otros ).
La información de tipo (3) puede almacenarse en la tabla de símbolos de un archivo objeto (incluidos archivos ejecutables o bibliotecas compartidas) o en un archivo aparte. Los demás tipos son necesarios para el funcionamiento de las funciones que no son de depuración y, por lo general, deben permanecer en el archivo objeto.
La información de depuración puede ocupar bastante espacio, especialmente los nombres de archivo y los números de línea. Por lo tanto, los binarios con información de depuración pueden volverse bastante grandes, a menudo varias veces el tamaño del archivo sin símbolos (a los que se les han eliminado los símbolos y otra información de depuración). [ 2 ] Para evitar este tamaño adicional, la mayoría de las distribuciones de sistemas operativos incluyen binarios sin símbolos, es decir, de los que se han eliminado todos los símbolos de depuración (tipo (3)). Esto se logra, por ejemplo, con el comando strip en Unix . Si la información de depuración está en archivos separados, estos archivos generalmente no se incluyen en la distribución y solo se obtienen cuando son necesarios.
El comando strip solo elimina información de los tipos (1) y (3) ; el primero no siempre por completo, ya que también se le puede indicar que conserve los símbolos necesarios para el procesamiento de reubicación ( --strip-unneeded), que a menudo se encuentran en una biblioteca dinámica. Para una eliminación más completa, puede ser necesario cambiar la configuración del compilador: por ejemplo, la visibilidad de los símbolos afecta directamente al tamaño de la tabla de símbolos (1), y si RTTI está habilitado en C++ determina si se produce (2). [ 3 ]
Símbolos incrustados
Sistemas tipo Unix
stabs fue un formato primitivo para símbolos de depuración en sistemas tipo Unix . Funcionaba codificando información adicional en la tabla de símbolos como cadenas con formato especial y es ampliamente aplicable a muchos formatos de archivos objeto.
El formato DWARF , más reciente y con especificaciones formales, lo ha reemplazado en gran medida. Esta especificación permite que cualquier compilador o ensamblador compatible cree símbolos de depuración en un formato estandarizado, y que cualquier depurador, como el Depurador GNU (GDB), acceda a estos símbolos y los muestre. DWARF se puede usar con cualquier formato de objeto que admita secciones con nombre.
IBM OS/360 y sus sucesores
Los compiladores para la línea de mainframes de IBM descendientes del System/360 tienen una opción TEST que hace que el compilador incluya información de depuración [ 4 ] [ 5 ] [ 6 ] en el archivo objeto. De manera similar, los editores Binder y linkage tienen una opción TEST que hace que la información de depuración se conserve [ 7 ] en el módulo de carga. Varias herramientas de depuración, por ejemplo, OS/360 TESTRAN, TSO TEST, tienen la capacidad de usar las definiciones de símbolos incrustadas.
El ensamblador de alto nivel de IBM (HLASM) admite el formato de archivo de objeto generalizado ( GOFF ), que incluye ADATA integrado .
Windows
Windows PE/COFF puede usar un formato CodeView integrado, aunque en programas de producción esta información generalmente se extrae a un archivo PDB separado (ver más abajo). PE/COFF también puede usar un formato de información de depuración COFF heredado. [ 8 ]
En las cadenas de herramientas GNU, DWARF se utiliza en PE/COFF. Esta información también se puede extraer a un archivo PDB usando cv2pdb .
Formatos obsoletos
- Formato de módulo de objeto reubicable (OMF) para Intel x86, los archivos .OBJ en DOS: información de depuración codificada como "comentarios" (obsoleto) [ 9 ]
- IEEE-695 : formato obsoleto utilizado en el Z80 . Utiliza campos de "comentario". [ 10 ] [ 11 ]
- COFF : Considerado uno de los sucesores de OMF, combina tablas de símbolos (para identificadores) y anotaciones en el segmento de texto (para información más avanzada).
Archivos de depuración externos
OS/390 y otros
El ensamblador de alto nivel de IBM (HLASM) y otros compiladores que se ejecutan, por ejemplo, en z/OS , tienen una opción ADATA que produce un archivo de datos asociados (ADATA) [ 12 ] que contiene más información que la producida por la antigua opción TEST. En particular, el archivo ADATA incluye líneas de código fuente y sus metadatos.
Símbolos de depuración de Microsoft
Los compiladores de Microsoft generan un archivo de base de datos de programa (PDB) que contiene símbolos de depuración. Algunas empresas incluyen el PDB en sus CD/DVD para facilitar la resolución de problemas, mientras que otras (como Microsoft y Mozilla Corporation ) permiten descargar los símbolos de depuración de Internet. El depurador WinDbg y el IDE de Visual Studio se pueden configurar para descargar automáticamente los símbolos de depuración de las bibliotecas de vínculos dinámicos (DLL) de Windows cuando sea necesario. Los símbolos de depuración PDB que distribuye Microsoft incluyen únicamente funciones públicas, variables globales y sus tipos de datos. Mozilla Corporation cuenta con una infraestructura similar, pero distribuye información de depuración completa.
Existen dos variantes del formato de archivo PDB para PE/COFF (exe, dll). El formato cerrado se utiliza para archivos que contienen código máquina convencional. El formato abierto se utiliza para archivos que contienen código .NET.
Sistemas tipo Unix
DWARF puede emitirse o extraerse en un archivo objeto sin código que sirve como archivo separado para información de depuración. En los sistemas Linux se proporciona un servicio de búsqueda por debuginfod.
En las plataformas de Apple , los símbolos de depuración se emiten opcionalmente durante el proceso de compilación como archivos dSYM , que son paquetes que contienen un archivo Mach-O sin código pero con símbolos de depuración. Apple utiliza el término "simbolizar" para referirse a la sustitución de direcciones en archivos de diagnóstico por valores legibles por humanos. [ 13 ]
En contextos que no son de código máquina
La minimización del código fuente lo vuelve ilegible. Un mapa de origen , que incluye una correspondencia entre las entidades minimizadas y las entidades originales del código fuente, sirve como información para la depuración.
Los formatos de código de bytes como Java y .NET también pueden tener diferentes cantidades de información de depuración. [ 14 ]
Historia
Los depuradores simbólicos existen desde la era de los mainframes , prácticamente desde la introducción de las primeras pantallas adecuadas para mostrar la información de depuración simbólica (e incluso antes, con volcados simbólicos en papel). No se limitaban a lenguajes compilados de alto nivel, sino que también estaban disponibles para programas en lenguaje ensamblador . Para el IBM/360 , estos generaban código objeto (bajo demanda) que incluía "tarjetas SYM". Estas solían ser ignoradas por el cargador de programas, pero resultaban útiles para un depurador simbólico, ya que se almacenaban en la misma biblioteca de programas que el código lógico ejecutable.
Véase también
Referencias
- ↑ "Depuración con símbolos" . Centro de desarrollo de Windows . Microsoft . Archivado del original el 11/01/2020 . Consultado el 11/01/2020 .
- ↑ "¿Para qué sirven los símbolos?" . TechNet . Microsoft . 15 de julio de 2008. Archivado del original el 26 de diciembre de 2014. Consultado el 4 de enero de 2015 .
- ↑ "Tamaños binarios y RTTI" . Blog de Sandor Dargo . 1 de marzo de 2023.
- ↑ "Apéndice D: Formatos de registro de entrada del editor TESTRAN" (PDF) . Sistema operativo IBM System/360 - TESTRAN - Manual de lógica del programa - Número de programa 3605-PT-516 (PDF) . TNL GN26-8016. IBM . 1 de abril de 1971. págs. 119–120 . GY28-6611-0 . Consultado el 11 de julio de 2024 .
- ↑ "Apéndice. Convenciones de entrada y formatos de registro" (PDF) . MVS/370 - Linkage Editor Logic - Data Facility Product 5665-295 - Release 1.0 (PDF) (Primera ed.). IBM . Abril de 1983. págs. 195–206 . LY26-3921-0 . Consultado el 11 de julio de 2024 .
- ↑ LY26-3921-0 , pág. 195, Figura 69. Registro de entrada SYM (Imagen de tarjeta) .
- ↑ LY26-3921-0 , pág. 199, Figura 76. Registro SYM (Módulo de carga) .
- ↑ "Dentro de Windows: Un análisis en profundidad del formato de archivo ejecutable portátil Win32, parte 2" . learn.microsoft.com .
- ↑ "OMF: Formato de módulo de objeto reubicable" (PDF) .
- ↑ "Formato de archivo de objeto IEEE-695" .
- ↑ "Descifrando el formato de archivo LOD de Zilog" . www.cocoacrumbs.com . 1 de enero de 2023.
- ↑ "Apéndice C. Salida de archivos de datos asociados" (PDF) . High Level Assembler for z/OS & z/VM & z/VSE - Programmer's Guide - Version 1 Release 6 (PDF) . IBM . 2015. pp. 227–275 . SC26-4941-07 . Consultado el 11 de julio de 2024 .
- ↑ "Comprensión y análisis de informes de fallos de aplicaciones iOS" . Biblioteca para desarrolladores de iOS . Apple, Inc. 8 de enero de 2018 [29 de enero de 2009]. Nota técnica TN2151. Archivado del original el 19 de diciembre de 2019. Consultado el 11 de enero de 2020 .
- ↑ "Java Deep Dive: formato de archivo de clase para información de depuración" . synyx.de (en alemán). 14 de marzo de 2019.
Enlaces externos
- http://referencesource.microsoft.com/ Servidor de referencia de Microsoft
- https://firefox-source-docs.mozilla.org/taskcluster/using-the-mozilla-source-server.html Servidor de código fuente de Mozilla
- http://www.symbolsource.org/ Bibliotecas .NET en SymbolSource
- Eager, Michael J. (abril de 2012) [2006]. "Introducción al formato de depuración DWARF" (PDF) . Archivado (PDF) del original el 23 de diciembre de 2018. Recuperado el 12 de noviembre de 2014 .(Nota: Se centra en DWARF, pero también analiza los formatos de depuración en general, con una descripción general de los principales formatos).
- Depuración