在进行转储文件分析时,我设置了指向Microsoft符号服务器的符号路径。windbg如何知道转储文件是在哪个操作系统下生成的,以及它如何为该操作系统下载正确的符号?
为了将符号匹配为二进制,WinDbg查看名为"调试目录"的东西。调试目录是PE模块中的部分(这是Windows对所有类型的可执行文件使用的文件格式)。调试目录只是包含到调试信息类型的链接。如果你在cmd窗口link /dump /headers <my_module_name>
中输入command,它会打印出如下内容:
...
Debug Directories
Time Type Size RVA Pointer
-------- ------ -------- -------- --------
4CC78FB1 cv 22 00102588 101988 Format: RSDS, {30976E0B-FBF7-45EF-8608-99932F2B791F}, 2, ntdll.pdb
4CC78FB1 ( A) 4 00102584 101984 BB03197E
...
这是ntdll.dll的输出。你可以看到CV(对于CodeView)调试信息包含在ntdll中。并且该pdb的GUID必须与链接中的GUID匹配。该GUID在构建时为每个模块随机生成。
命令!lmi
在WinDbg中也会以不同的格式转储这些信息。
当WinDbg从符号服务器加载符号时,它会向符号服务器发送请求以获取名为"ntdll"的文件。带有匹配GUID的pdb'。