Un símbolo de depuración es un tipo especial de símbolo que adjunta información adicional a la tabla de símbolos de un archivo de objeto , como una biblioteca compartida o un ejecutable . Esta información permite que un depurador simbólico obtenga acceso a información del código fuente del binario, como los nombres de los identificadores, incluidas las variables y las rutinas.
La información simbólica puede compilarse junto con el archivo binario del módulo , o distribuirse en un archivo separado, o simplemente descartarse durante la compilación y/o vinculación .
Esta información puede ser útil al intentar investigar y reparar una aplicación que falla o cualquier otro error. [1]
Los símbolos de depuración normalmente incluyen no solo el nombre de una función o variable global, sino también el nombre del archivo de código fuente en el que aparece el símbolo, así como el número de línea en el que está definido. Otra información incluye el tipo de símbolo (entero, punto flotante, función, excepción, etc.), el alcance ( ámbito de bloque o ámbito global ), el tamaño y, en el caso de las clases, el nombre de la clase y los métodos y miembros que contiene.
Parte de la información de depuración incluye la línea de código en el archivo fuente que define ese símbolo (una función o variable global), así como los símbolos asociados con los marcos de excepción.
Esta información puede almacenarse en la tabla de símbolos de un archivo de objeto, archivo ejecutable o biblioteca compartida, o puede estar en un archivo separado.
En algunos sistemas, por ejemplo, z/OS , la información de depuración contiene más que sólo la tabla de símbolos, por ejemplo, el ADATA analizado en § OS/390 et al contiene el código fuente.
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 símbolos de depuración pueden llegar a ser bastante grandes, a menudo varias veces el tamaño del archivo despojado. [2] Para evitar este tamaño adicional, la mayoría de las distribuciones de sistemas operativos envían binarios despojados, es decir, de los cuales se han eliminado todos los símbolos de depuración. Esto se logra, por ejemplo, con el comando strip en Unix . Si la información de depuración está en archivos separados, esos archivos normalmente no se envían con la distribución.
Stabs fue uno de los primeros formatos para depurar símbolos en sistemas tipo Unix . El formato más reciente DWARF , para el que existen especificaciones formales, lo ha reemplazado en gran medida. La 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 GNU Debugger (GDB), pueda acceder a estos símbolos y mostrarlos.
Los compiladores para la línea de mainframes de IBM que descienden del System/360 tienen una opción TEST que hace que el compilador incluya información de depuración [3] [4] [5] en el archivo de objeto. De manera similar, los editores de enlaces y enlazadores tienen una opción TEST que hace que la información de depuración se conserve [6] en el módulo de carga. Varias herramientas de depuración, por ejemplo, OS/360 TESTRAN, TSO TEST, tienen la capacidad de utilizar las definiciones de símbolos incrustadas.
El ensamblador de alto nivel de IBM (HLASM) y otros compiladores que se ejecutan en, por ejemplo, z/OS , tienen una opción ADATA que produce un archivo de datos asociados (ADATA) [7] 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.
Los compiladores de Microsoft generan un archivo de base de datos de programas (PDB) que contiene símbolos de depuración. Algunas empresas envían el PDB en su CD/DVD para permitir la resolución de problemas y otras empresas (como Microsoft y Mozilla Corporation ) permiten descargar símbolos de depuración de Internet. El depurador WinDbg y el IDE de Visual Studio se pueden configurar para descargar automáticamente símbolos de depuración para bibliotecas de vínculos dinámicos (DLL) de Windows a pedido. Los símbolos de depuración PDB que distribuye Microsoft incluyen solo funciones públicas, variables globales y sus tipos de datos. Mozilla Corporation tiene una infraestructura similar, pero distribuye información de depuración completa.
En las plataformas de Apple , los símbolos de depuración se emiten opcionalmente durante el proceso de compilación como archivos dSYM. Apple utiliza el término "simbolizar" para referirse al reemplazo de direcciones en archivos de diagnóstico con valores legibles para humanos. [8]
Los depuradores simbólicos existen desde la era de los mainframes , casi desde la primera introducción de pantallas de ordenador 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 y también estaban disponibles para programas en lenguaje ensamblador . Para el IBM/360 , estos generaban código objeto (a petición) que incluía "tarjetas SYM". El cargador de programas solía ignorarlas, pero eran útiles para un depurador simbólico, ya que se guardaban en la misma biblioteca de programas que el código lógico ejecutable.