Programadatbázis

A PDB egyetlen fájl, amely logikailag több alfájlból, úgynevezett streamekből áll. Úgy tervezték, hogy optimalizálja a PDB módosításának folyamatát, ahogyan azt a fordítások és inkrementális linkek végzik. A streamek eltávolíthatók, hozzáadhatók vagy kicserélhetők anélkül, hogy más streameket át kellene írni, és a streameket leíró metaadatok módosítása is minimálisra csökken.

A PDB fix méretű, általában 1K, 2K vagy 4K méretű oldalakba van rendezve, amelyeket 0-tól kezdve sorszámoznak.

Megjegyzés: Feltételezzük, hogy minden numerikus információ (pl., folyam- és oldalszámok) az Intel x86 alapú processzorok natív, little-endian formában tárolódnak. A pdbparse Python kód ezt a feltételezést teszi.

StreamEdit

A PDB-ben minden stream több oldalt foglal el, amelyek nem feltétlenül vannak sorszámozva. A folyamnak van egy száma és egy hossza. A folyam tartalma az oldalainak a folyam hosszára csonkolva összefűzött oldalai.

Metaadatok formátumaEdit

A PDB metaadatainak feladata az összes komponens folyam azonosítása, megadva az egyes folyamokra vonatkozó oldalak hosszát és sorrendjét. A streamek sorszámozása 0-val kezdődik. Van egy számozatlan gyökér stream is, amely tartalmazza a metaadatok egy részét.

HeaderEdit

A PDB egy fejléccel kezdődik, amely a következőkből áll:

  • Signature, amely az adott formátum azonosítására és érvényesítésére szolgál. Az aláírás hossza az adott formátumtól függően változik.
  • A fejléc többi része az aláírás által azonosított formátumtól függően változik.

A fejléc hosszabb lehet, mint egy oldal.

A Microsoft-eszközök két PDB formátumot használnak:

7Edit verzió

Az aláírás "Microsoft C/C++ MSF 7.00\r\n\x1ADS"(32 bájt).

A fejléc maradéka a következőkből áll:

  • Lapméret, 4 bájt.
  • Allokációs tábla mutatója, 4 bájt. Ennek jelentése ismeretlen. Úgy tűnik, hogy van egy allokációs tábla, egy 65 536 bitből (8 192 bájt) álló tömb, amely a PDB végén található, és az 1 bit olyan oldalt jelent, amelyet nem használnak.
  • A fájloldalak száma, 4 bájt.
  • Root stream mérete, 4 bájt.
  • rezervált, 4 bájt.
  • A Root stream oldalszámlistájának oldalszáma. Nem magának a Root streamnek a helyét jelzi, csak annak a struktúrát tartalmazó oldalnak a helyét, amely az oldalaira mutat. Ezen az oldalon a Root stream oldalszám-lista jelzi azokat az oldalakat, ahol a Root stream tárolódik. Oldalanként 4 bájtot tartalmaz, ami elegendő a fenti Root stream méretének fedezésére.

Root streamEdit

A root stream leírja az összes PDB streamet, kezdve a stream 0-val. Tartalma a PDB formátum verziójától függően változik.

2. verzióSzerkesztés

A gyökérfolyam a következőkből áll:

  • folyamok száma, 2 bájt.
  • Tartalék, 2 bájt.
  • Minden folyamhoz:
    • folyam mérete, 4 bájt.
    • Tartalék, 4 bájt.
  • Minden folyamhoz:
    • Folyam oldalszámlistája, oldalanként 2 bájt, elegendő a fenti folyammérethez.

7-es verzióSzerkesztés

A gyökérfolyam a következőkből áll:

  • folyamszám, 4 bájt.
  • Minden folyamhoz:
    • folyam mérete, 4 bájt.
  • Minden folyamhoz:
    • Folyam oldalszámlistája, oldalanként 4 bájt, elegendő a fenti folyammérethez.

A folyam tartalmaEdit

A Microsoft eszközei különböző típusú információkat tárolnak különböző számú folyamban. Egyes folyamszámokhoz fix információtípus tartozik, más folyamokat pedig a fent említett fix típusú folyamokban azonosítanak.

Az 1. folyam annak ellenőrzésére szolgál, hogy a PDB ugyanaz a fájl-e, amelyre egy futtatható vagy objektumfájl folyamban hivatkoznak.

  • Version, 4 bájt.
  • időbélyegző, 4 bájt.
  • Kor, 4 bájt. Ez az a szám, ahányszor módosították ezt a PDB-t a létrehozása óta.
  • GUID, 16 bájt.
  • A következő nevek teljes hossza, 4 bájt. Nulla végződésű karakterláncok követik.

A 2. és 4. folyam tartalmazza a típusokra vonatkozó információkat. A tényleges típusrekordok a programban használt típusokat határozzák meg. Ezeknek a rekordoknak a felépítése a Microsoft által biztosított cvinfo.h fájlban található. A rekordoknak kétféle változata van, mindegyiknek saját indexszámkészlete van: típusazonosítók és típusok; a 2. folyamban csak a típusok, a 4. folyamban csak a típusazonosítók tárolódnak. Az indexeket arra használjuk, hogy ezekre a rekordokra hivatkozzunk a szimbólumrekordokon és más típusrekordokon belül.

  • A fejléc:
    • Version, 4 bájt.
    • A fejléc mérete, 4 bájt.
    • Minimális és maximális (utolsó + 1) index a típusrekordokhoz (egyenként 4 bájt).
    • A következő adatok mérete, 4 bájt, a folyam végéig.
  • Hash információk:
    • Stream szám, 2 bájt, 2 bájt kitöltéssel.
    • Hash kulcs, 4 bájt.
    • Buckets, 4 bájt.
    • HashVals, TiOff és HashAdj, mindegyik egy offsetből és hosszból áll, mindegyik 4 bájt.
  • Type records, változó hosszúságú, count = (maximum – minimum) a fenti fejlécből.

Stream 3 egy könyvtár más streamek számára. Megjegyzés, ez nincs jelen a 2. verzióban, sem a fordító által előállított PDB-ben. A folyam egy fejléccel kezdődik, amelyet úgy töltünk fel, hogy összesen 64 bájt legyen

.

.

.

.

.

.

PDB Stream 3 Header (struct NewDBIHdr)
Offset Size Name Description
0 4 Signature Header identifier, == 0xFFFFFFFFFF
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 2 snPSSyms
18 2 usVerPdbDllBuild a pdb dll verziójának építése, amely ezt a pdb-t legutóbb építette
20 2 snSymRecs
22 2 VerPdbDllRBld rbld a pdb dll verziója, amely ezt a pdb-t legutóbb építette
24 4 cbGpModi az rgmodi alfolyam mérete
28 4 cbSC a Section Contribution alfolyam mérete
32 4 cbSecMap szekciótérkép mérete
36 4 cbFileInfo fájlinformációs adatfolyam mérete
40 4 cbTSMap a Type Server Map alfolyam mérete
44 4 iMFC MFC Index
48 4 cbDbgHdr a folyam végéhez csatolt opcionális DbgHdr információ mérete
52 4 cbECInfo az EC alfolyam bájtjainak száma, vagy 0, ha nincs EC engedélyezve 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 Gépazonosító, ugyanaz, mint a COFF objektumformátumban használt, e.g., hex 8664 Intel x86 64-bites
60 4 RESERVED jövőbeli bővítés, 64 bájtra kitöltve
  • Modulinformáció, változó hosszúságú. Teljes méret a fenti fejlécben. Minden egyes, a linkelő által használt objektummodulhoz tartozik egy ilyen
    • Opened, 4 bájt.
    • Symbol info.
      • Section number, 2 bájt + 2 bájt padding.
      • Offset és size, egyenként 4 bájt.
      • Flags, 4 bájt.
      • Modulszám, 2 bájt + 2 bájt kitöltés.
      • CRC-k a szakaszadatokhoz és a relokációs adatokhoz, egyenként 4 bájt.
    • Flags, 2 bájt.
    • Stream number, 2 bájt.
    • Symbols size, 4 bájt.
    • Régi és új sorszám infó mérete, egyenként 4 bájt.
    • A forrásfájlok száma, 2 bájt + 2 bájt kitöltés.
    • Offsets, 4 bájt.
    • niSource és niCompiler, egyenként 4 bájt.
    • Modul neve, nullával végződő byte string.
    • Objekt neve, nullával végződő byte string.
    • Tömörítés 4 byte többszörösére.
  • Szekció hozzájárulások, szakaszcímek, file info, ts map és EC info. Méretük a fenti fejlécben található.
  • Hibakereső fejléc,
    • A régi keretmutató kihagyás, kivételek, javítások, objektumtérképek a forráshoz és a forrásból, szakaszfejlécek, Token Ring ID-k, Xdata, Pdata, új keretmutató kihagyás és szakaszfejléc eredet számai. Mindegyik 2 bájt.