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 的狀態。