PDB 序列化雜湊表格式¶
簡介¶
PDB 格式的設計目標之一是提供對除錯資訊的加速存取,因此,在某些情況下,雜湊表會被序列化並直接嵌入到檔案中,而不是要求消費者讀取值列表並即時重建雜湊表。
序列化格式支援任意大小和容量的雜湊表,以及值類型和雜湊函數。唯一支援的鍵值類型是 uint32。唯一的要求是生產者和消費者對雜湊函數達成一致。因此,本文不再進一步討論雜湊函數,而是假設對於 PDB 檔案雜湊表的特定實例,正在使用適當的雜湊函數。
磁碟格式¶
.--------------------.-- +0
| Size |
.--------------------.-- +4
| Capacity |
.--------------------.-- +8
| Present Bit Vector |
.--------------------.-- +N
| Deleted Bit Vector |
.--------------------.-- +M ─╮
| Key | │
.--------------------.-- +M+4 │
| Value | │
.--------------------.-- +M+4+sizeof(Value) │
... ├─ |Capacity| Bucket entries
.--------------------. │
| Key | │
.--------------------. │
| Value | │
.--------------------. ─╯
大小 - 雜湊表中包含的值的數量。
容量 - 雜湊表中的 bucket 數量。生產者應維持負載因子不大於
2/3*容量+1
。存在位元向量 - 一個序列化的位元向量,其中包含關於哪些 bucket 具有有效值的信息。如果 bucket 有值,則會設定對應的位元;如果 bucket 沒有值(因為 bucket 是空的或因為該值是墓碑值),則會取消設定該位元。
已刪除位元向量 - 一個序列化的位元向量,其中包含關於哪些 bucket 具有墓碑值的信息。如果此 bucket 中的條目被刪除,則會設定該位元;否則將取消設定該位元。
鍵和值 - 容量為 Capacity 的雜湊 bucket 列表,其中第一個條目是鍵(始終為 uint32),第二個條目是值。可以通過檢查存在和已刪除位元向量來確定每個 bucket 的狀態(有效、空、已刪除)。
存在和已刪除位元向量¶
指示每個 bucket 狀態的位元向量序列化方式如下
.--------------------.-- +0
| Word Count |
.--------------------.-- +4
| Word_0 | ─╮
.--------------------.-- +8 │
| Word_1 | │
.--------------------.-- +12 ├─ |Word Count| values
... │
.--------------------. │
| Word_N | │
.--------------------. ─╯
這些 words 在被視為連續的位元組塊時,表示具有以下佈局的位元向量
.------------. .------------.------------.
| Word_N | ... | Word_1 | Word_0 |
.------------. .------------.------------.
| | | | |
+N*32 +(N-1)*32 +64 +32 +0
其中此位元向量的第 k 個位元表示雜湊表中第 k 個 bucket 的狀態。