Ohjelmatietokanta

PDB on yksi tiedosto, joka koostuu loogisesti useista osatiedostoista, joita kutsutaan streameiksi. Se on suunniteltu optimoimaan PDB:hen tehtävien muutosten tekeminen, joka suoritetaan kääntämällä ja inkrementaalisilla linkityksillä. Virtoja voidaan poistaa, lisätä tai korvata kirjoittamatta muita virtoja uudelleen, ja muutokset virtoja kuvaavaan metatietoon on myös minimoitu.

PDB on järjestetty kiinteän kokoisiksi sivuiksi, tyypillisesti 1K, 2K tai 4K, jotka on numeroitu juoksevasti alkaen 0:sta.

Huomautus: Oletetaan, että kaikki numeerinen tieto (esim, virta- ja sivunumerot) tallennetaan little-endian-muodossa, joka on Intel x86-pohjaisten prosessoreiden alkuperäinen muoto. Python-koodi pdbparse tekee tämän oletuksen.

StreamEdit

Jokainen PDB:n stream vie useita sivuja, jotka eivät välttämättä ole juoksevasti numeroituja. Virralla on numero ja pituus. Virran sisältö on sen sivujen ketjutus, joka on typistetty virran pituuteen.

Metatiedon muotoEdit

PDB:n metatiedon tehtävänä on yksilöidä kaikki komponenttivirrat ja antaa kunkin virran pituus ja sivujen järjestys. Virrat numeroidaan juoksevasti alkaen numerosta 0. Lisäksi on olemassa numeroimaton juurivirta, joka sisältää osan metatiedoista.

HeaderEdit

PDB alkaa otsikolla, joka koostuu:

  • Signature, jota käytetään tietyn formaatin tunnistamiseen ja validointiin. Allekirjoituksen pituus vaihtelee tietyn formaatin mukaan.
  • Ohtiotsikon loppuosa vaihtelee allekirjoituksen tunnistaman formaatin mukaan.

Ohtiotsikko voi olla pidempi kuin yksi sivu.

Microsoft-työkalut käyttävät kahta PDB-formaattia:

Versio 7Edit

Allekirjoitus on "Microsoft C/C++ MSF 7.00\r\n\x1ADS"(32 tavua).

Loppuosa otsikosta koostuu:

  • Sivun koko, 4 tavua.
  • Allokaatiotaulukon osoitin, 4 tavua. Tämän merkitys on tuntematon. Näyttää olevan allokaatiotaulukko, 65 536 bitin (8 192 tavua) joukko, joka sijaitsee PDB:n lopussa, ja 1-bitti tarkoittaa sivua, jota ei käytetä.
  • Tiedoston sivujen lukumäärä, 4 tavua.
  • Juurivirran koko, 4 tavua.
  • varattu, 4 tavua.
  • Juurivirran sivunumeroluettelon sivunumero. Se ei ilmaise itse Root stream -virran sijaintia, vaan ainoastaan sen sivun, joka sisältää sen sivuihin viittaavan rakenteen. Tällä sivulla Root stream -sivunumeroluettelo osoittaa sivut, joille Root stream on tallennettu. Se sisältää 4 tavua per sivu, mikä riittää kattamaan edellä mainitun Root stream -koon.

Root streamEdit

Juurivirta kuvaa kaikki PDB:n virrat alkaen virrasta 0. Sen sisältö vaihtelee PDB-formaatin version mukaan.

Versio 2Edit

Juurivirta koostuu seuraavista osista:

  • Virtojen määrä, 2 tavua.
  • Varattu, 2 tavua.
  • Kunkin virran osalta:
    • Virran koko, 4 tavua.
    • Varattu, 4 tavua.
  • Kullekin virralle:
    • Virran sivunumeroluettelo, 2 tavua per sivu, riittää kattamaan yllä olevan virran koon.

Versio 7Edit

Juurivirta koostuu:

  • Virtojen lukumäärä, 4 tavua.
  • Kunkin virran osalta:
    • Virran koko, 4 tavua.
  • Kunkin virran osalta:
    • Virran sivunumeroluettelo, 4 tavua per sivu, riittää kattamaan edellä mainitun virran koon.

Virran sisältöMuokkaus

Microsoftin työkalut tallentavat erityyppisiä tietoja eri numeroituihin virtoihin. Joihinkin virranumeroihin liittyy kiinteä tietotyyppi, ja muut virrat tunnistetaan edellä mainituissa kiinteätyyppisissä virroissa.

Virran 1 avulla tarkistetaan, että PDB on sama tiedosto, johon viitataan suoritettavan tiedoston tai objektitiedoston virrassa.

  • Versio, 4 tavua.
  • Aika-päivämäärän leimaaminen, 4 tavua.
  • Aika-ikä, 4 tavua. Näin monta kertaa tätä PDB:tä on muutettu sen luomisen jälkeen.
  • GUID, 16 tavua.
  • Seuraavien nimien kokonaispituus, 4 tavua. Sitä seuraavat nollapääteiset merkkijonot.

Stream 2 ja stream 4 sisältävät tyyppitiedot. Varsinaiset tyyppitietueet määrittelevät ohjelmassa käytettävät tyypit. Näiden tietueiden rakenne löytyy Microsoftin toimittamasta tiedostosta cvinfo.h. Tietueita on kahdenlaisia, ja kummallakin on omat indeksinumeronsa: tyyppitunnukset ja tyypit; vain tyypit tallennetaan stream 2:een ja vain tyyppitunnukset tallennetaan stream 4:ään. Indeksejä käytetään viittaamaan näihin tietueisiin symbolitietueiden ja muiden tyyppitietueiden sisältä.

  • Ohjeotsikko:
    • Versio, 4 tavua.
    • Ohjeotsikon koko, 4 tavua.
    • Tyyppitietueiden (kumpikin 4 tavua) minimi- ja maksimi-indeksi (viimeiset + 1).
    • Seuraavan datan koko 4 tavua virran loppuun asti.
  • Hash-tiedot:
    • Virran numero, 2 tavua, jossa on 2 tavun pehmuste.
    • Hash-avain, 4 tavua.
    • Säiliöt, 4 tavua.
    • HashVals-, TiOff- ja HashAdj-tietueet, jotka kukin koostuvat offsetista (siirtymästä) ja pituudesta (pituudesta), kumpikin 4 tavua.
  • Tyyppitietueet, vaihteleva pituus, määrä = (maksimi – minimi) yllä olevasta otsikosta.

Stream 3 on hakemisto muille streameille. Huomaa, että sitä ei ole versiossa 2 eikä kääntäjän tuottamassa PDB:ssä. Virta alkaa otsikolla, joka on täytetty siten, että se on yhteensä 64 tavua

.

.

.

32.

PDB Stream 3 Header (struct NewDBIHdr)
Offset Size Name Description
0 4 Signature Headerin tunniste, == 0xFFFFFFFF
4 4 HeaderVersion Version of the 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 rakennusversio pdb dll:stä, joka rakensi tämän pdb:n viimeksi
20 2 snSymRecs
22 2 VerPdbDllRBld rbld versio pdb-dll:stä, joka rakensi tämän pdb:n viimeisimmän
24 4 cbGpModi rgmodi-alivirran koko
28 4 cbSC osion Contribution-alivirran koko
4 cbSecMap jakokartan koko
36 4 cbFileInfo tiedoston tietovirran koko
40 4 cbTSMap Tyyppipalvelinkartan alivirran koko
44 4 iMFC MFC-indeksi
48 4 cbDbgHdr virran loppuun liitettävän valinnaisen DbgHdr-infon koko
52 4 cbECInfo EC-alivirran tavumäärä, tai 0, jos EC ei ole käytössä 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 Koneen tunniste, joka on sama kuin COFF-objektien formaatissa, esim.g., hex 8664 Intel x86 64-bittiselle
60 4 RESERVED tulevaisuuden laajennus, pehmuste 64 tavuun
  • Moduulitieto, vaihteleva pituus. Kokonaiskoko edellä olevassa otsikossa. Näitä on yksi jokaiselle linkittäjän käyttämälle objektimoduulille
    • Opened, 4 tavua.
    • Symbolitieto.
      • Osionumero, 2 tavua + 2 tavua padding.
      • Offset ja size, 4 tavua kumpikin.
      • Flags, 4 tavua.
      • Moduulin numero, 2 tavua + 2 tavua pehmustetta.
      • CRC:t osiotiedoille ja siirtotiedoille, 4 tavua kumpikin.
    • Flagit, 2 tavua.
    • Virran numero, 2 tavua.
    • Symbolien koko, 4 tavua.
    • Vanhan ja uuden rivinumerotiedon koko, 4 tavua kumpikin.
    • Lähdetiedostojen määrä, 2 tavua + 2 tavua pehmuste.
    • Offsets, 4 tavua.
    • niSource ja niCompiler, 4 tavua kumpikin.
    • Moduulin nimi, nollapääteinen tavu merkkijono.
    • Objektin nimi, nollapääteinen tavu merkkijono.
    • Täytteistys 4 tavun kerrannaiseksi.
  • Osioiden osuudet, osioiden otsikot, tiedostotieto, ts-kartta ja EC-tieto. Niiden koot löytyvät yllä olevasta otsikosta.
  • Debug-otsikko,
    • Vanhan kehysosoittimen poisjäännin, poikkeusten, korjausten, objektikarttojen lähteeseen ja lähteestä, osioiden otsikoiden, Token Ring ID:n, Xdatan, Pdatan, uuden kehysosoittimen poisjäännin ja osioiden otsikoiden alkuperän virranumerot. 2 tavua kukin.