Base de datos del programa - Program database
Extensión de nombre de archivo |
.pdb
|
---|---|
Tipo de medio de Internet |
NULO |
Desarrollado por | Microsoft |
Tipo de formato | Depurar |
La base de datos de programas ( PDB ) es un formato de archivo propietario (desarrollado por Microsoft ) para almacenar información de depuración sobre un programa (o, comúnmente, módulos de programa como DLL o EXE ). Los archivos PDB suelen tener una extensión .pdb . Normalmente, un archivo PDB se crea a partir de archivos de origen durante la compilación. Almacena una lista de todos los símbolos en 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 módulo en sí, porque ocupa mucho espacio.
Aplicaciones
Cuando se depura un programa, el depurador carga la información de depuración del archivo PDB y la utiliza para localizar símbolos o relacionar el estado de ejecución actual de un código fuente del programa. Microsoft Visual Studio utiliza archivos PDB como formato de archivo principal para depurar información.
Otro uso de los archivos PDB es en los 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, bajo las opciones apropiadas, almacenarán información en una sola 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 tipos en la PDB. Cada compilación agregará al PDB cualquier tipo que no se encuentre allí, de modo que las referencias en archivos de objeto ya compilados sigan siendo válidas.
El vinculador 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 vinculador. Si el enlace se realiza de forma incremental, una PDB existente se modifica agregando, reemplazando solo la información que pertenece a los módulos agregados o reemplazados, y agregando cualquier tipo nuevo que no esté ya en la PDB.
Los archivos PDB generalmente se eliminan 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 hay herramientas de terceros que también pueden extraer información de PDB como radare2 y pdbparse
Formato de flujo múltiple
El PDB es un solo archivo que está lógicamente compuesto por varios subarchivos, llamados flujos . Está diseñado para optimizar el proceso de realizar cambios en el PDB, como lo realizan las compilaciones y los enlaces incrementales. Las transmisiones se pueden eliminar, agregar o reemplazar sin volver a escribir ninguna otra transmisión, y los cambios en los metadatos que describen las transmisiones también se minimizan.
La PDB está organizada en páginas de tamaño fijo , típicamente 1K, 2K o 4K, numeradas consecutivamente comenzando en 0.
Nota : Se presume que toda la información numérica ( p. Ej., Números de página y de flujo) se almacena en formato little-endian, el formato nativo de los procesadores basados en Intel x86. El código pdbparse Python hace esta suposición.
Arroyo
Cada secuencia de la PDB ocupa varias páginas, que no están necesariamente numeradas consecutivamente. La secuencia tiene un número y una longitud. El contenido de la transmisión es la concatenación de sus páginas, truncada a la longitud de la transmisión.
Formato de metadatos
La función de los metadatos de PDB es identificar todos los flujos de componentes, dando la longitud y secuencia de páginas para cada flujo. Los flujos se numeran consecutivamente comenzando con 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 con el formato específico.
- El resto del encabezado varía con el formato identificado por la firma.
El encabezado puede tener más de una página.
Las herramientas de Microsoft utilizan dos formatos PDB:
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 la tabla de asignación, 4 bytes. Se desconoce el significado de esto. Parece haber una tabla de asignación, una matriz de 65.536 bits (8.192 bytes), ubicada al final de la PDB, y un bit de 1 bit significa una página que no se está utilizando.
- Número de páginas de archivo, 4 bytes.
- Tamaño de la secuencia raíz, 4 bytes.
- reservado, 4 bytes.
- Número de página de la lista de números de página de la secuencia raíz. No indica la ubicación del flujo raíz en sí, solo de 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 de la secuencia raíz indica las páginas donde se almacena la secuencia raíz. Contiene 4 bytes por página, suficiente para cubrir el tamaño de la secuencia raíz anterior.
Corriente raíz
El flujo raíz describe todos los flujos de PDB que comienzan con el flujo 0. Su contenido varía con la versión del formato de PDB.
Versión 2
El flujo raíz consta de:
- Número de flujos, 2 bytes.
- Reservado, 2 bytes.
- Para cada corriente:
- Tamaño de la secuencia, 4 bytes.
- Reservado, 4 bytes.
- Para cada corriente:
- Lista de números de página de transmisión, 2 bytes por página, suficiente para cubrir el tamaño de transmisión superior.
Versión 7
El flujo raíz consta de:
- Número de flujos, 4 bytes.
- Para cada corriente:
- Tamaño de la secuencia, 4 bytes.
- Para cada corriente:
- Lista de números de página de transmisión, 4 bytes por página, suficiente para cubrir el tamaño de transmisión superior.
Contenido de la transmisión
Las herramientas de Microsoft almacenan diferentes tipos de información en diferentes flujos numerados. Algunos números de flujo tienen un tipo de información fijo asociado con ellos, y otros flujos se identifican en los flujos de tipo fijo mencionados anteriormente.
La secuencia 1 se utiliza para verificar que la PDB es el mismo archivo al que se hace referencia en una secuencia de archivos ejecutables o de objetos.
- Versión, 4 bytes.
- Sello de fecha y hora, 4 bytes.
- Edad, 4 bytes. Este es el número de veces que se ha modificado este AP desde su creación.
- GUID, 16 bytes.
- Longitud total de los siguientes nombres, 4 bytes. Seguido de cadenas de caracteres terminadas en nulo.
Información de tipos de retención de Stream 2 y Stream 4 . Los registros de tipo real 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: ID de tipo y tipos; solo los tipos se almacenan en el flujo 2 y solo los ID 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 tipos.
- 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 de la secuencia.
- 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, recuento = (máximo - mínimo) del encabezado anterior.
La secuencia 3 es un directorio para otras secuencias. Tenga en cuenta que no está presente en la Versión 2 ni en un PDB producido por un compilador. La secuencia comienza con un encabezado que se rellena para tener 64 bytes en total
Compensar | Tamaño | Nombre | Descripción |
---|---|---|---|
0 | 4 | Firma | Identificador de encabezado, == 0xFFFFFFFF |
4 | 4 | HeaderVersion | Versión del encabezado |
8 | 4 | Edad | |
12 | 2 | snGSSyms | |
14 | 2 | usVerAll |
union {
struct {
USHORT usVerPdbDllMin : 8; // minor version and
USHORT usVerPdbDllMaj : 7; // major version and
USHORT fNewVerFmt : 1; // flag telling us we have rbld stored elsewhere (high bit of original major version)
} vernew; // that built this pdb last.
struct {
USHORT usVerPdbDllRbld: 4;
USHORT usVerPdbDllMin : 7;
USHORT usVerPdbDllMaj : 5;
} verold;
USHORT usVerAll;
};
|
dieciséis | 2 | snPSSyms | |
18 | 2 | usVerPdbDllBuild | compilar la versión del dll pdb que construyó este pdb por última vez |
20 | 2 | snSymRecs | |
22 | 2 | VerPdbDllRBld | versión rbld del dll pdb que construyó este pdb por última vez |
24 | 4 | cbGpModi | tamaño de la subflujo rgmodi |
28 | 4 | cbSC | tamaño de la subflujo de contribución de sección |
32 | 4 | cbSecMap | tamaño del mapa de la sección |
36 | 4 | cbFileInfo | tamaño del flujo de información del archivo |
40 | 4 | cbTSMap | tamaño del subflujo Type Server Map |
44 | 4 | iMFC | Índice MFC |
48 | 4 | cbDbgHdr | tamaño de la información DbgHdr opcional adjunta al final de la secuencia |
52 | 4 | cbECInfo | número de bytes en el subflujo EC, o 0 si no hay Mods habilitados para EC |
56 | 2 | banderas |
struct _flags {
USHORT fIncLink:1; // true if linked incrmentally (really just if ilink thunks are present)
USHORT fStripped:1; // true if PDB::CopyTo stripped the private data out
USHORT fCTypes:1; // true if this PDB is using CTypes.
USHORT unused:13; // reserved, must be 0.
} flags;
|
58 | 2 | wMachine | Identificador de máquina, el mismo que se utiliza en el formato de objeto COFF, p. Ej., Hex 8664 para Intel x86 de 64 bits |
60 | 4 | RESERVADO | expansión futura, relleno a 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 vinculador
- 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, relleno de 2 bytes + 2 bytes.
- CRC para datos de sección y datos de reubicaciones, 4 bytes cada uno.
- Banderas, 2 bytes.
- Número de secuencia, 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 de objeto, cadena de bytes terminada en nulo.
- Relleno a múltiplos de 4 bytes.
- Contribuciones de sección, encabezados de sección, información de archivo, mapa de 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 desde y hacia la fuente, encabezados de sección, ID de Token Ring, Xdata, Pdata, omisión de puntero de marco nuevo y origen de encabezado de sección. 2 bytes cada uno.
Ver también
enlaces externos
- El formato PDB se documenta aquí Información de Microsoft sobre el formato PDB.
- Documentación de Microsoft MSDN en 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 PDB según LLVM