Programdatabas

Databasen är en enda fil som logiskt sett består av flera underfiler, så kallade streams. Den är utformad för att optimera processen att göra ändringar i PDB, som utförs av kompileringar och inkrementella länkar. Streams kan tas bort, läggas till eller ersättas utan att skriva om andra streams, och ändringarna av de metadata som beskriver streams minimeras också.

Den PDB är organiserad i sidor av fast storlek, typiskt 1K, 2K eller 4K, som numreras fortlöpande med början vid 0.

Anmärkning: Det förutsätts att all numerisk information (t.ex, stream- och sidnummer) lagras i little-endian-form, den ursprungliga formen för Intel x86-baserade processorer. Pythonkoden pdbparse gör detta antagande.

StreamEdit

Varje ström i PDB upptar flera sidor, som inte nödvändigtvis är löpande numrerade. Strömmen har ett nummer och en längd. Streamens innehåll är sammankopplingen av dess sidor, trunkerade till streamens längd.

Metadata formatEdit

Funktionen för metadata i PDB är att identifiera alla ingående streams, med angivande av längden, och sekvensen av sidor för varje stream. Strömmarna är numrerade i följd och börjar med 0. Det finns också en rotström, onumrerad, som innehåller en del av metadata.

HeaderEdit

Den PDB börjar med en header, som består av:

  • Signatur, som används för att identifiera och validera det specifika formatet. Signaturens längd varierar med det specifika formatet.
  • Resten av rubriken varierar med det format som identifieras av signaturen.

Rubriken kan vara längre än en enda sida.

Microsoft-verktyg använder två PDB-format:

Version 7Edit

Signaturen är "Microsoft C/C++ MSF 7.00\r\n\x1ADS"(32 bytes).

Resten av huvudet består av:

  • Sidstorlek, 4 byte.
  • Allokeringstabellpekare, 4 byte. Betydelsen av detta är okänd. Det verkar finnas en allokeringstabell, en matris med 65 536 bitar (8 192 byte), belägen i slutet av PDB, och en 1-bit innebär en sida som inte används.
  • Antal filsidor, 4 byte.
  • Root stream size, 4 byte.
  • Reserved, 4 byte.
  • Sidnummer i listan över sidnumren i Root stream. Det anger inte platsen för själva Root stream, utan endast för den sida som innehåller den struktur som pekar på dess sidor. På den sidan anger Root stream page number list de sidor där Root stream lagras. Den innehåller 4 bytes per sida, vilket är tillräckligt för att täcka den ovan nämnda storleken på Root stream.

Root streamEdit

Root stream beskriver alla PDB-strömmar som börjar med stream 0. Dess innehåll varierar med PDB-formatversionen.

Version 2Redigera

Rotströmmen består av:

  • Antal strömmar, 2 bytes.
  • Reserverat, 2 bytes.
  • För varje ström:
    • Storlek på strömmen, 4 bytes.
    • Reserverat, 4 bytes.
  • För varje ström:
    • Lista med sidnummer för strömmen, 2 byte per sida, tillräckligt för att täcka strömstorleken ovan.

Version 7Edit

Rotströmmen består av:

  • Antal strömmar, 4 byte.
  • För varje ström:
    • Strömstorlek, 4 byte.
  • För varje ström:
    • Strömmarnas sidnummerlista, 4 byte per sida, tillräckligt för att täcka ovanstående strömstorlek.

Strömmens innehållEdit

Microsoft-verktyg lagrar olika sorters information i olika numrerade strömmar. Vissa strömnummer har en fast informationstyp associerad med dem, och andra strömmar identifieras i de tidigare nämnda strömmarna av fast typ.

Ström 1 används för att verifiera att PDB:n är samma fil som det hänvisas till i en ström av en körbar fil eller en objektsfil.

  • Version, 4 bytes.
  • Datumsstämpel, 4 bytes.
  • Age, 4 bytes. Detta är antalet gånger som denna PDB har ändrats sedan den skapades.
  • GUID, 16 bytes.
  • Total längd på följande namn, 4 bytes. Följt av teckensträngar med nollterminering.

Stream 2 och stream 4 innehåller information om typer. De faktiska typposterna definierar de typer som används i programmet. Strukturen för dessa poster finns i filen cvinfo.h som tillhandahålls av Microsoft. Det finns två typer av poster, var och en med sin egen uppsättning indexnummer: typ-ID och typer. Endast typer lagras i stream 2 och endast typ-ID lagras i stream 4. Indexen används för att hänvisa till dessa poster från symbolposter och andra typposter.

  • En rubrik:
    • Version, 4 byte.
    • Storlek på rubriken, 4 byte.
    • Minimalt och maximalt (sista + 1) index för typposter (4 byte vardera).
    • Storlek på följande data, 4 byte, till slutet av strömmen.
  • Hash-information:
    • Strömmens nummer, 2 byte med 2 byte utfyllnad.
    • Hash-nyckel, 4 byte.
    • Bucketar, 4 byte.
    • HashVals, TiOff och HashAdj, som var och en består av en offset och längd, vardera 4 byte.
  • Typposter, variabel längd, antal = (maximum – minimum) från ovanstående rubrik.

Stream 3 är en katalog för andra streams. Observera att den inte finns i version 2 och inte heller i en PDB som produceras av en kompilator. Strömmen börjar med en rubrik som är fylld för att bli totalt 64 bytes

>

PDB Stream 3 Header (struct NewDBIHdr)
Offset Size Name Description
0 4 Signature Header identifier, == 0xFFFFFFFFFFFF
4 4 HeaderVersion Version av Header
8 4 Age
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; };
16 2 snPSSyms
18 2 usVerPdbDllBuild byggversion av den pdb dll som byggde den här pdb:n senast
20 2 snSymRecs
22 2 VerPdbDllRBld rbld-versionen av den pdb-dll som byggde den här pdb:n senast
24 4 cbGpModi storlek på rgmodi-underströmmen
28 4 cbSC storlek på underströmmen för avsnittsbidrag
32 4 cbSecMap storlek på sektionskartan
36 4 cbFileInfo storlek på filinformationsströmmen
40 4 cbTSMap storlek på underströmmen för typserverns karta
44 4 iMFC MFC Index
48 4 cbDbgHdr storlek på valfri DbgHdr-information som läggs till i slutet av strömmen
52 4 cbECInfo antal bytes i EC-subström, eller 0 om ingen EC är aktiverad Mods
56 2 flags
 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 Maskinidentifierare, samma som används i COFF-objektformat, t.ex.g., hex 8664 för Intel x86 64-bitars
60 4 RESERVED framtida expansion, fylls upp till 64 bytes
  • Modulinformation, variabel längd. Total storlek i ovanstående rubrik. Det finns en sådan för varje objektmodul som används av länkaren
    • Opened, 4 byte.
    • Symbolinformation.
      • Sektionsnummer, 2 byte + 2 byte utfyllnad.
      • Offset och storlek, 4 byte vardera.
      • Flags, 4 byte.
      • Modulnummer, 2 byte + 2 byte utfyllnad.
      • CRCs för sektionsdata och omlokaliseringsdata, 4 byte vardera.
    • Flags, 2 byte.
    • Streamnummer, 2 byte.
    • Symbolstorlek, 4 byte.
    • Old and new line number info sizes, 4 bytes each.
    • Number of source files, 2 bytes + 2 bytes padding.
    • Offsets, 4 bytes.
    • niSource and niCompiler, 4 bytes each.
    • Modulnamn, null terminated byte string.
    • Objektnamn, null terminated byte string.
    • Paddning till ett multipel av 4 bytes.
  • Avsnittsbidrag, avsnittsrubriker, filinformation, ts map och EC-information. Deras storlekar finns i ovanstående rubrik.
  • Felsökningsrubrik,
    • Strömnummer för Old Frame Pointer Omission, Exceptions, Fixups, Object Maps to and from Source, Section Headers, Token Ring IDs, Xdata, Pdata, New Frame Pointer Omission och Section Header Origin. 2 bytes vardera.