La base de datos de programas ( PDB ) es un formato de archivo (desarrollado por Microsoft ) para almacenar información de depuración sobre un programa (o, comúnmente, módulos de programa como una DLL o un EXE ). Los archivos PDB suelen tener una extensión .pdb . Un archivo PDB se crea normalmente a partir de archivos de origen durante la compilación. Almacena una lista de todos los símbolos de un módulo con sus direcciones y, posiblemente, el nombre del archivo y la línea en la que se declaró el símbolo. Esta información de símbolos no se almacena en el propio módulo, porque ocupa mucho espacio. [ cita requerida ]
Aplicaciones
Cuando se depura un programa, el depurador carga información de depuración del archivo PDB y la utiliza para localizar símbolos o relacionar el estado de ejecución actual del código fuente de un programa. Microsoft Visual Studio utiliza archivos PDB como su formato de archivo principal para la información de depuración.
Otro uso de los archivos PDB es en servicios que recopilan datos de fallas de los usuarios y los relacionan con las partes específicas del código fuente que causan (o están involucradas en) la falla.
Los compiladores de Microsoft almacenarán, con las opciones adecuadas, información en un único PDB sobre los tipos que se encuentran en las fuentes compiladas. La información de depuración específica de cada fuente se almacena en el archivo de objeto compilado y contiene referencias a los tipos del PDB. Cada compilación agregará al PDB los tipos que aún no se encuentren allí, de modo que las referencias en los archivos de objeto ya compilados sigan siendo válidas.
El enlazador de Microsoft, con las opciones adecuadas, crea un PDB completamente nuevo que combina la información de depuración que se encuentra en sus módulos de entrada, los tipos a los que hacen referencia esos módulos y otra información generada por el enlazador. Si el enlace se realiza de forma incremental, se modifica un PDB existente agregando o reemplazando únicamente la información correspondiente a los módulos agregados o reemplazados, y agregando cualquier tipo nuevo que no esté ya en el PDB.
Los archivos PDB suelen eliminarse del paquete de distribución de los programas. Los desarrolladores los utilizan durante la depuración para ahorrar tiempo y obtener información.
Extrayendo información
El formato PDB se documenta aquí, la información se puede extraer de un archivo PDB utilizando las interfaces DIA (Debug Interface Access), disponibles en Microsoft Windows . También existen herramientas de terceros que también pueden extraer información de PDB, como radare2 y pdbparse.
Formato de transmisión múltiple
El PDB es un archivo único que se compone lógicamente de varios subarchivos, llamados streams . Está diseñado para optimizar el proceso de realizar cambios en el PDB, como se realiza mediante compilaciones y enlaces incrementales. Los streams se pueden eliminar, agregar o reemplazar sin reescribir ningún otro stream, y también se minimizan los cambios en los metadatos que describen los streams.
El PDB está organizado en páginas de tamaño fijo , normalmente 1K, 2K o 4K, numeradas consecutivamente comenzando en 0.
Nota : Se supone que toda la información numérica ( por ejemplo, números de secuencia y de página) se almacena en formato little-endian, el formato nativo de los procesadores basados en Intel x86. El código Python de pdbparse hace esta suposición.
Arroyo
Cada flujo del PDB ocupa varias páginas, que no necesariamente están numeradas consecutivamente. El flujo tiene un número y una longitud. El contenido del flujo es la concatenación de sus páginas, truncada a la longitud del flujo.
Formato de metadatos
La función de los metadatos del PDB es identificar todos los flujos de componentes, indicando la longitud y la secuencia de páginas de cada flujo. Los flujos se numeran consecutivamente a partir del 0. También hay un flujo raíz, sin numerar, que contiene algunos de los metadatos.
Encabezamiento
El PDB comienza con un encabezado, que consta de:
- Firma, utilizada para identificar y validar el formato específico. La longitud de la firma varía según el formato específico.
- El resto del encabezado varía según el formato identificado por la firma.
El encabezado puede ser más largo que una sola página.
Las herramientas de Microsoft utilizan dos formatos PDB:
Versión 2
La firma es "Microsoft C/C++ program database 2.00\r\n\032JG\0\0"(44 bytes).
El resto del encabezado consta de:
- Tamaño de página, 4 bytes.
- Página de inicio, 2 bytes.
- Número de páginas de archivo, 2 bytes.
- Tamaño del flujo raíz, 4 bytes.
- reservado, 4 bytes.
- Lista de números de página del flujo raíz, 2 bytes por página, suficiente para cubrir el tamaño del flujo raíz mencionado anteriormente.
Versión 7
La firma es "Microsoft C/C++ MSF 7.00\r\n\x1ADS\0\0\0"(32 bytes).
El resto del encabezado consta de:
- Tamaño de página, 4 bytes.
- Puntero de tabla de asignación, 4 bytes. Se desconoce su significado. Parece haber una tabla de asignación, una matriz de 65.536 bits (8.192 bytes), ubicada al final del PDB, y un bit significa una página que no se está utilizando.
- Número de páginas de archivo, 4 bytes.
- Tamaño del flujo raíz, 4 bytes.
- reservado, 4 bytes.
- Número de página de la lista de números de página del flujo raíz. No indica la ubicación del flujo raíz en sí, sino solo la página que contiene la estructura que apunta a sus páginas. En esa página, la lista de números de página del flujo raíz indica las páginas donde se almacena el flujo raíz. Contiene 4 bytes por página, lo suficiente para cubrir el tamaño del flujo raíz mencionado anteriormente.
Corriente de raíz
La secuencia raíz describe todas las secuencias PDB comenzando con la secuencia 0. Su contenido varía según la versión del formato PDB.
Versión 2
La secuencia raíz consta de:
- Número de transmisiones, 2 bytes.
- Reservado, 2 bytes.
- Para cada transmisión:
- Tamaño del flujo, 4 bytes.
- Reservado, 4 bytes.
- Para cada transmisión:
- Lista de números de páginas de transmisión, 2 bytes por página, suficiente para cubrir el tamaño de transmisión anterior.
Versión 7
La secuencia raíz consta de:
- Número de transmisiones, 4 bytes.
- Para cada transmisión:
- Tamaño del flujo, 4 bytes.
- Para cada transmisión:
- Lista de números de páginas de transmisión, 4 bytes por página, suficiente para cubrir el tamaño de transmisión anterior.
Contenido del stream
Las herramientas de Microsoft almacenan distintos tipos de información en secuencias numeradas diferentes. Algunos números de secuencia tienen un tipo de información fijo asociado a ellos, y otras secuencias se identifican en las secuencias de tipo fijo mencionadas anteriormente.
La secuencia 1 se utiliza para verificar que el PDB sea el mismo archivo al que se hace referencia en una secuencia de archivo ejecutable o de objeto.
- Versión, 4 bytes.
- Sello de fecha y hora, 4 bytes.
- Edad, 4 bytes. Es la cantidad de veces que se modificó este PDB desde su creación.
- GUID, 16 bytes.
- Longitud total de los siguientes nombres: 4 bytes. Seguidos de cadenas de caracteres terminadas en cero.
Los flujos 2 y 4 contienen información de tipos. Los registros de tipos reales definen los tipos utilizados en el programa. La estructura de estos registros se puede encontrar en el archivo cvinfo.h proporcionado por Microsoft. Hay dos tipos de registros, cada uno con su propio conjunto de números de índice: identificadores de tipo y tipos; solo los tipos se almacenan en el flujo 2 y solo los identificadores de tipo se almacenan en el flujo 4. Los índices se utilizan para hacer referencia a estos registros desde dentro de los registros de símbolos y otros registros de tipo.
- Un encabezado:
- Versión, 4 bytes.
- Tamaño del encabezado, 4 bytes.
- Índice mínimo y máximo (último + 1) para registros de tipo (4 bytes cada uno).
- Tamaño de los siguientes datos, 4 bytes, hasta el final del flujo.
- Información hash:
- Número de flujo, 2 bytes con 2 bytes de relleno.
- Clave hash, 4 bytes.
- Cubos, 4 bytes.
- HashVals, TiOff y HashAdj, cada uno compuesto por un desplazamiento y una longitud, cada uno de 4 bytes.
- Escriba registros, longitud variable, conteo = (máximo - mínimo) del encabezado anterior.
El flujo 3 es un directorio para otros flujos. Tenga en cuenta que no está presente en la versión 2 ni en un PDB producido por un compilador. El flujo comienza con un encabezado que se rellena para tener un total de 64 bytes.
- Información del módulo, longitud variable. Tamaño total en el encabezado anterior. Hay uno de estos para cada módulo de objeto utilizado por el enlazador.
- Abierto, 4 bytes.
- Información del símbolo.
- Número de sección, 2 bytes + 2 bytes de relleno.
- Desplazamiento y tamaño, 4 bytes cada uno.
- Banderas, 4 bytes.
- Número de módulo, 2 bytes + 2 bytes de relleno.
- CRC para datos de sección y datos de reubicaciones, 4 bytes cada uno.
- Banderas, 2 bytes.
- Número de flujo, 2 bytes.
- Tamaño de los símbolos, 4 bytes.
- Tamaños de información de números de línea antiguos y nuevos, 4 bytes cada uno.
- Número de archivos de origen, 2 bytes + 2 bytes de relleno.
- Desplazamientos, 4 bytes.
- niSource y niCompiler, 4 bytes cada uno.
- Nombre del módulo, cadena de bytes terminada en nulo.
- Nombre del objeto, cadena de bytes terminada en nulo.
- Relleno a múltiplo de 4 bytes.
- Contribuciones de sección, encabezados de sección, información de archivo, mapa ts e información de EC. Sus tamaños se encuentran en el encabezado anterior.
- Encabezado de depuración,
- Números de flujo para omisión de puntero de marco antiguo, excepciones, correcciones, mapas de objetos hacia y desde la fuente, encabezados de sección, identificaciones de Token Ring, Xdata, Pdata, omisión de puntero de marco nuevo y origen de encabezado de sección. 2 bytes cada uno.
Véase también
Enlaces externos
- El formato PDB está documentado aquí Información de Microsoft sobre el formato PDB.
- Documentación de Microsoft MSDN sobre DIA
- Cómo inspeccionar el contenido de un archivo de base de datos de programa (PDB)
- Símbolos y archivos de símbolos, MSDN
- ¿Qué hay dentro de un archivo PDB? / Blog del equipo de Visual C++
- Estructura del PDB según LLVM