符号存储格式
SymStore 使用文件系统本身作为数据库。 它创建一个大型目录树,其目录名称基于符号文件时间戳、签名、年龄和其他数据等内容。
例如,将多个不同的 acpi.dbgs 添加到服务器后,目录可能如下所示:
Directory of \\mybuilds\symsrv\acpi.dbg
10/06/1999 05:46p <DIR> .
10/06/1999 05:46p <DIR> ..
10/04/1999 01:54p <DIR> 37cdb03962040
10/04/1999 01:49p <DIR> 37cdb04027740
10/04/1999 12:56p <DIR> 37e3eb1c62060
10/04/1999 12:51p <DIR> 37e3ebcc27760
10/04/1999 12:45p <DIR> 37ed151662060
10/04/1999 12:39p <DIR> 37ed15dd27760
10/04/1999 11:33a <DIR> 37f03ce962020
10/04/1999 11:21a <DIR> 37f03cf7277c0
10/06/1999 05:38p <DIR> 37fa7f00277e0
10/06/1999 05:46p <DIR> 37fa7f01620a0
在此示例中,acpi.dbg 符号文件的查找路径可能如下所示:\\mybuilds\symsrv\acpi.dbg\37cdb03962040。
查找目录中可能存在三个文件:
acpi.dbg(如果存储了文件)
file.ptr,其中包含实际符号文件的路径(如果存储了指针)
refs.ptr,其中包含 acpi.dbg 的所有当前位置的列表,以及当前添加到符号存储中的此时间戳和图像大小
显示 \\mybuilds\symsrv\acpi.dbg\37cdb03962040 的目录列表会提供以下内容:
10/04/1999 01:54p 52 file.ptr
10/04/1999 01:54p 67 refs.ptr
文件 file.ptr 包含文本字符串“\\mybuilds\symbols\x86\2128.chk\symbols\sys\acpi.dbg”。 由于此目录中没有名为 acpi.dbg 的文件,调试器将尝试在 \\mybuilds\symbols\x86\2128.chk\symbols\sys\acpi.dbg 中查找该文件。
refs.ptr 的内容仅由 SymStore 使用,而不能由调试器使用。 此文件包含此目录中发生的所有事务的记录。 refs.ptr 中的示例行可能是:
0000000026,ptr,\\mybuilds\symbols\x86\2128.chk\symbols\sys\acpi.dbg
这表明已添加指向 \\mybuilds\symbols\x86\2128.chk\symbols\sys\acpi.dbg 的指针,事务为“0000000026”。
某些符号文件在各种产品或内部版本或特定产品中保持不变。 其中一个示例是 Windows 2000 文件 msvcrt.pdb。 \\mybuilds\symsrv\msvcrt.pdb 的目录列表显示,只有两个版本的 msvcrt.pdb 已添加到符号服务器:
Directory of \\mybuilds\symsrv\msvcrt.pdb
10/06/1999 05:37p <DIR> .
10/06/1999 05:37p <DIR> ..
10/04/1999 11:19a <DIR> 37a8f40e2
10/06/1999 05:37p <DIR> 37f2c2272
但是,\\mybuilds\symsrv\msvcrt.pdb\37a8f40e2 的目录列表显示 refs.ptr 中有几个指针。
Directory of \\mybuilds\symsrv\msvcrt.pdb\37a8f40e2
10/05/1999 02:50p 54 file.ptr
10/05/1999 02:50p 2,039 refs.ptr
\\mybuilds\symsrv\msvcrt.pdb\37a8f40e2\refs.ptr 的内容如下:
0000000001,ptr,\\mybuilds\symbols\x86\2137\symbols\dll\msvcrt.pdb
0000000002,ptr,\\mybuilds\symbols\x86\2137.chk\symbols\dll\msvcrt.pdb
0000000003,ptr,\\mybuilds\symbols\x86\2138\symbols\dll\msvcrt.pdb
0000000004,ptr,\\mybuilds\symbols\x86\2138.chk\symbols\dll\msvcrt.pdb
0000000005,ptr,\\mybuilds\symbols\x86\2139\symbols\dll\msvcrt.pdb
0000000006,ptr,\\mybuilds\symbols\x86\2139.chk\symbols\dll\msvcrt.pdb
0000000007,ptr,\\mybuilds\symbols\x86\2140\symbols\dll\msvcrt.pdb
0000000008,ptr,\\mybuilds\symbols\x86\2140.chk\symbols\dll\msvcrt.pdb
0000000009,ptr,\\mybuilds\symbols\x86\2136\symbols\dll\msvcrt.pdb
0000000010,ptr,\\mybuilds\symbols\x86\2136.chk\symbols\dll\msvcrt.pdb
0000000011,ptr,\\mybuilds\symbols\x86\2135\symbols\dll\msvcrt.pdb
0000000012,ptr,\\mybuilds\symbols\x86\2135.chk\symbols\dll\msvcrt.pdb
0000000013,ptr,\\mybuilds\symbols\x86\2134\symbols\dll\msvcrt.pdb
0000000014,ptr,\\mybuilds\symbols\x86\2134.chk\symbols\dll\msvcrt.pdb
0000000015,ptr,\\mybuilds\symbols\x86\2133\symbols\dll\msvcrt.pdb
0000000016,ptr,\\mybuilds\symbols\x86\2133.chk\symbols\dll\msvcrt.pdb
0000000017,ptr,\\mybuilds\symbols\x86\2132\symbols\dll\msvcrt.pdb
0000000018,ptr,\\mybuilds\symbols\x86\2132.chk\symbols\dll\msvcrt.pdb
0000000019,ptr,\\mybuilds\symbols\x86\2131\symbols\dll\msvcrt.pdb
0000000020,ptr,\\mybuilds\symbols\x86\2131.chk\symbols\dll\msvcrt.pdb
0000000021,ptr,\\mybuilds\symbols\x86\2130\symbols\dll\msvcrt.pdb
0000000022,ptr,\\mybuilds\symbols\x86\2130.chk\symbols\dll\msvcrt.pdb
0000000023,ptr,\\mybuilds\symbols\x86\2129\symbols\dll\msvcrt.pdb
0000000024,ptr,\\mybuilds\symbols\x86\2129.chk\symbols\dll\msvcrt.pdb
0000000025,ptr,\\mybuilds\symbols\x86\2128\symbols\dll\msvcrt.pdb
0000000026,ptr,\\mybuilds\symbols\x86\2128.chk\symbols\dll\msvcrt.pdb
0000000027,ptr,\\mybuilds\symbols\x86\2141\symbols\dll\msvcrt.pdb
0000000028,ptr,\\mybuilds\symbols\x86\2141.chk\symbols\dll\msvcrt.pdb
0000000029,ptr,\\mybuilds\symbols\x86\2142\symbols\dll\msvcrt.pdb
0000000030,ptr,\\mybuilds\symbols\x86\2142.chk\symbols\dll\msvcrt.pdb
这表明同一 msvcrt.pdb 用于存储在 \\mybuilds\symsrv 上的 Windows 2000 符号的多个内部版本。
下面是包含文件和指针添加混合的目录示例:
Directory of E:\symsrv\dbghelp.dbg\38039ff439000
10/12/1999 01:54p 141,232 dbghelp.dbg
10/13/1999 04:57p 49 file.ptr
10/13/1999 04:57p 306 refs.ptr
在本例中,refs.ptr 包含以下内容:
0000000043,file,e:\binaries\symbols\retail\dll\dbghelp.dbg
0000000044,file,f:\binaries\symbols\retail\dll\dbghelp.dbg
0000000045,file,g:\binaries\symbols\retail\dll\dbghelp.dbg
0000000046,ptr,\\MyDir\bin\symbols\retail\dll\dbghelp.dbg
0000000047,ptr,\\foo2\bin\symbols\retail\dll\dbghelp.dbg
因此,事务 43、44 和 45 将同一文件添加到服务器,事务 46 和 47 添加了指针。 如果删除事务 43、44 和 45,则将从目录中删除文件 dbghelp.dbg。 然后,该目录将包含以下内容:
Directory of e:\symsrv\dbghelp.dbg\38039ff439000
10/13/1999 05:01p 49 file.ptr
10/13/1999 05:01p 130 refs.ptr
现在,file.ptr 包含“\\foo2\bin\symbols\retail\dll\dbghelp.dbg”,refs.ptr 包含
0000000046,ptr,\\MyDir\bin\symbols\retail\dll\dbghelp.dbg
0000000047,ptr,\\foo2\bin\symbols\retail\dll\dbghelp.dbg
每当 refs.ptr 中的最后一个条目是指针时,文件 file.ptr 将存在并包含关联文件的路径。 每当 refs.ptr 中的最后一个条目是文件时,此目录中将不存在 file.ptr。 因此,删除 refs.ptr 中最后一个条目的任何删除操作都可能导致创建、删除或更改 file.ptr。