Base de datos del programa - Program database

Base de datos del programa
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

Encabezado del flujo 3 de PDB (struct NewDBIHdr) [1]
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