BDP este un singur fișier care, din punct de vedere logic, este compus din mai multe subfișiere, numite fluxuri. Acesta este conceput pentru a optimiza procesul de efectuare a modificărilor în PDB, așa cum se realizează prin compilații și legături incrementale. Fluxurile pot fi eliminate, adăugate sau înlocuite fără a rescrie alte fluxuri, iar modificările aduse metadatelor care descriu fluxurile sunt, de asemenea, minimizate.
PDB este organizat în pagini de dimensiuni fixe, de obicei 1K, 2K sau 4K, numerotate consecutiv începând de la 0.
Nota: Se presupune că toate informațiile numerice (de ex, numerele de flux și de pagină) sunt stocate în forma little-endian, forma nativă pentru procesoarele bazate pe Intel x86. Codul Python pdbparse face această presupunere.
StreamEdit
Care flux din PDB ocupă mai multe pagini, care nu sunt neapărat numerotate consecutiv. Fluxul are un număr și o lungime. Conținutul fluxului este concatenarea paginilor sale, trunchiat la lungimea fluxului.
Format metadateEdit
Funcția metadatelor din PDB este de a identifica toate fluxurile componente, oferind lungimea și secvența de pagini pentru fiecare flux. Fluxurile sunt numerotate consecutiv începând cu 0. Există, de asemenea, un flux rădăcină, nenumerotat, care conține o parte din metadate.
AntetEdit
PDB începe cu un antet, format din:
- Semnatura, utilizată pentru a identifica și valida formatul specific. Lungimea semnăturii variază în funcție de formatul specific.
- Cu restul antetului variază în funcție de formatul identificat de semnătură.
În antetul poate fi mai lung decât o singură pagină.
Uneltele Microsoft utilizează două formate PDB:
Versiunea 7Edit
Semnătura este "Microsoft C/C++ MSF 7.00\r\n\x1ADS"
(32 octeți).
Rămășița antetului constă din:
- Dimensiunea paginii, 4 octeți.
- Puntator la tabelul de alocare, 4 octeți. Semnificația acestuia este necunoscută. Se pare că există o tabelă de alocare, o matrice de 65.536 de biți (8.192 de octeți), situată la sfârșitul PDB, iar un bit 1 înseamnă o pagină care nu este utilizată.
- Numărul de pagini de fișier, 4 octeți.
- Dimensiunea fluxului rădăcină, 4 octeți.
- Rezervată, 4 octeți.
- Numărul paginii din lista cu numărul de pagini a fluxului rădăcină. Nu indică locația fluxului Root propriu-zis, ci doar a paginii care conține structura care indică paginile sale. La acea pagină, lista de numere de pagini a fluxului rădăcină indică paginile în care este stocat fluxul rădăcină. Conține 4 octeți pe pagină, suficient pentru a acoperi dimensiunea fluxului rădăcină de mai sus.
Flux rădăcinăEdit
Fluxul rădăcină descrie toate fluxurile PDB începând cu fluxul 0. Conținutul său variază în funcție de versiunea formatului PDB.
Versiunea 2Edit
Fluxul rădăcină este format din:
- Numărul de fluxuri, 2 octeți.
- Rezervat, 2 octeți.
- Pentru fiecare flux:
- Dimensiunea fluxului, 4 octeți.
- Rezervat, 4 octeți.
- Pentru fiecare flux:
- Lista numerelor de pagini ale fluxului, 2 octeți pe pagină, suficient pentru a acoperi dimensiunea fluxului de mai sus.
Versiunea 7Edit
Fluxul rădăcină este format din:
- Numărul de fluxuri, 4 octeți.
- Pentru fiecare flux:
- Dimensiunea fluxului, 4 octeți.
- Pentru fiecare flux:
- Lista numerelor de pagini ale fluxului, 4 octeți pe pagină, suficient pentru a acoperi dimensiunea fluxului de mai sus.
Conținutul fluxuluiEdit
Uneltele Microsoft stochează diferite tipuri de informații în fluxuri cu numere diferite. Unele numere de fluxuri au asociat un tip fix de informații, iar alte fluxuri sunt identificate în fluxurile de tip fix menționate mai sus.
Fluxul 1 este utilizat pentru a verifica dacă PDB este același fișier la care se face referire într-un flux de fișiere executabile sau de fișiere obiect.
- Versiune, 4 octeți.
- Ștampila datei, 4 octeți.
- Vârsta, 4 octeți. Acesta este numărul de ori de câte ori a fost modificat acest PDB de la crearea sa.
- GUID, 16 octeți.
- Lungimea totală a următoarelor nume, 4 octeți. Urmate de șiruri de caractere cu terminație nulă.
Stream 2 și stream 4 conțin informații despre tipuri. Înregistrările reale de tip definesc tipurile utilizate în program. Structura acestor înregistrări poate fi găsită în fișierul cvinfo.h furnizat de Microsoft. Există două tipuri de înregistrări, fiecare cu propriul set de numere de index: ID-uri de tip și tipuri; numai tipurile sunt stocate în fluxul 2 și numai ID-urile de tip sunt stocate în fluxul 4. Indicii sunt utilizați pentru a se referi la aceste înregistrări din cadrul înregistrărilor de simboluri și a altor înregistrări de tip.
- Un antet:
- Versiune, 4 octeți.
- Dimensiunea antetului, 4 octeți.
- Indexul minim și maxim (ultimul + 1) pentru înregistrările de tip (4 octeți fiecare).
- Dimensiunea datelor următoare, 4 octeți, până la sfârșitul fluxului.
- Informații hash:
- Numărul fluxului, 2 octeți cu o umplutură de 2 octeți.
- Cheia hash, 4 octeți.
- Buckets, 4 octeți.
- HashVals, TiOff, și HashAdj, fiecare compus dintr-un offset și o lungime, fiecare 4 octeți.
- Înregistrări de tip, lungime variabilă, număr = (maxim – minim) din antetul de mai sus.
Fluxul 3 este un director pentru alte fluxuri. Rețineți, acesta nu este prezent în versiunea 2 și nici într-un PDB produs de un compilator. Fluxul începe cu un antet care este căptușit pentru a avea 64 de octeți în total
Offset | Size | Name | Description | |
---|---|---|---|---|
0 | 4 | Signature | Identificatorul antetului, == 0xFFFFFFFFFFFF | |
4 | 4 | HeaderVersion | Versiunea antetului | |
8 | 4 | 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 | |||
16 | 2 | snPSSyms | ||
18 | 2 | usVerPdbDllBuild | versiunea de construire a dll-ului pdb care a construit acest pdb ultima dată | |
20 | 2 | snSymRecs | ||
22 | 2 | VerPdbDllRBld | rbld versiune a dll-ului pdb care a construit acest pdb ultima dată | |
24 | 4 | cbGpModi | size of rgmodi substream | |
28 | 4 | cbSC | size of Section Contribution substream | |
32 | 4 | cbSecMap | dimensiunea hărții secțiunii | |
36 | 4 | cbFileInfo | dimensiunea fluxului de informații despre fișier | |
40 | 4 | cbTSMap | dimensiunea sub-fluxului Type Server Map | |
44 | 4 | iMFC | MFC Index | |
48 | 4 | cbDbgHdr | dimensiunea informațiilor opționale DbgHdr adăugate la sfârșitul fluxului | |
52 | 4 | cbECInfo | numărul de octeți din subfluxul EC, sau 0 dacă nu este activat EC 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 | Identificatorul mașinii, același cu cel utilizat în formatul obiectului COFF, de ex.g., hex 8664 pentru Intel x86 pe 64 de biți | |
60 | 4 | RESERVED | expansiune viitoare, pad la 64 de octeți |
- Informații despre modul, lungime variabilă. Dimensiunea totală în antetul de mai sus. Există câte unul pentru fiecare modul obiect utilizat de linker
- Opened, 4 octeți.
- Informații despre simbol.
- Numărul secțiunii, 2 octeți + 2 octeți de umplutură.
- Offset și dimensiune, câte 4 octeți fiecare.
- Flags, 4 octeți.
- Numărul modulului, 2 octeți + 2 octeți de umplutură.
- CRC-uri pentru datele de secțiune și datele de relocare, 4 octeți fiecare.
- Flags, 2 octeți.
- Numărul fluxului, 2 octeți.
- Dimensiunea simbolurilor, 4 octeți.
- Dimensiunile info număr de linie vechi și nou, 4 octeți fiecare.
- Numărul de fișiere sursă, 2 octeți + 2 octeți de umplutură.
- Offsets, 4 octeți.
- niSource și niCompiler, 4 octeți fiecare.
- Numele modulului, șir de octeți cu terminație nulă.
- Numele obiectului, șir de octeți cu terminație nulă.
- Padding la un multiplu de 4 octeți.
- Contribuțiile secțiunii, antetele secțiunii, informații despre fișier, harta ts și informații CE. Dimensiunile acestora se găsesc în antetul de mai sus.
- În antetul de depanare,
- Numerele de flux pentru Old Frame Pointer Pointer Omission, Exceptions, Fixups, Object Maps to and from Source, Section Headers, Token Ring IDs, Xdata, Pdata, New Frame Pointer Omission, și Section Header Origin. 2 octeți fiecare.