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        |                        │
.--------------------.                       ─╯
  • **大小** - 雜湊表中包含的值的數量。

  • **容量** - 雜湊表中儲存區的數量。生產者應保持負載因子不超過 2/3*容量+1

  • **存在位元向量** - 一個序列化的位元向量,其中包含有關哪些儲存區具有有效值的資訊。如果儲存區具有值,則對應的位元將被設定,如果儲存區沒有值(因為儲存區為空或因為該值是 tombstone 值),則該位元將被取消設定。

  • **已刪除位元向量** - 一個序列化的位元向量,其中包含有關哪些儲存區具有 tombstone 值的資訊。如果此儲存區中的項目已刪除,則該位元將被設定,否則將被取消設定。

  • **鍵和值** - 一個包含 容量 個雜湊儲存區的列表,其中第一個項目是鍵(始終是 uint32),第二個項目是值。每個儲存區的狀態(有效、空、已刪除)可以通過檢查存在和已刪除位元向量來確定。

存在和已刪除位元向量

指示每個儲存區狀態的位元向量序列化如下

.--------------------.-- +0
|     Word Count     |
.--------------------.-- +4
|        Word_0      |        ─╮
.--------------------.-- +8    │
|        Word_1      |         │
.--------------------.-- +12   ├─ |Word Count| values
         ...                   │
.--------------------.         │
|       Word_N       |         │
.--------------------.        ─╯

這些字元,當被視為連續的位元組塊時,表示一個具有以下佈局的位元向量

  .------------.         .------------.------------.
  |   Word_N   |   ...   |   Word_1   |   Word_0   |
  .------------.         .------------.------------.
  |            |         |            |            |
+N*32      +(N-1)*32    +64          +32          +0

其中,此位元向量的第 k 個位元表示雜湊表中第 k 個儲存區的狀態。