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 個儲存區的狀態。