我真正的问题很简单:_NT_SYMBOL_PATH
中的路径是否递归搜索(特别是windbg)?
但是既然是/没有问题没有那么有趣,_NT_SYMBOL_PATH
的官方格式是什么?
答案 0 :(得分:4)
出于不同目的,存在不同类型的符号路径。我还没有完全理解,但这是我目前的理解:
平面格式(1层)可能是最容易存储您自己的私人符号。只需将所有PDB放入其中。
请注意,文档(作为EdChum提供的参考,可能是WinDbg帮助文件)不正确,恕我直言,特别是关于加载顺序。如果有疑问,最好找!sym noisy
找出实际的负载顺序。
在任何n层情况下,不会重复搜索符号路径。调试器将从DLL或EXE文件派生一种哈希,然后查找它。要将文件添加到n层符号路径,请使用WinDbg附带的symstore.exe。
2层符号路径看起来像
C:\symbols\<filename>.pdb\<hash>\<filename>.pdb
3层符号路径是
C:\symbols\<fi>\<filename>.pdb\<hash>\<filename>.pdb
其中fi
是文件名字母的第一个字母。
1层,2层和3层符号路径类型由特殊空文件pingme.txt
,index2.txt
,flat.txt
和000Admin
文件夹设置。您可以使用convertstore.exe
在各层之间进行转换。 Channel 9 Defrag tools #88 video和Episode #89对这些文件有所了解,但我没有在一个地方找到完整的参考文献。
我在一个目录中混合使用不同类型的符号路径时遇到了问题,因此您可能需要花时间阅读它,然后才能搞清楚。
答案 1 :(得分:2)
不,搜索不是递归的。但是,访问目录下的某些特定路径,这不是详尽的遍历。
探测的实际路径取决于条目的类型。您可以将两种类型的实体放入_NT_SYMBOL_PATH
:常规目录和符号存储。符号存储可以是网络共享或webdav共享,甚至是本地目录。
将符号加载选项设置为详细 - 命令为!sym noisy
。这将显示探测到的所有路径,以及在找到多个符号副本的情况下的优先级。以下是一个本地目录和一个本地符号存储的示例。
0:000> .reload -f notepad.exe
DBGHELP: e:\temp\notepad.pdb - file not found
DBGHELP: e:\temp\exe\notepad.pdb - file not found
DBGHELP: e:\temp\symbols\exe\notepad.pdb - file not found
SYMSRV: e:\mysyms\notepad.pdb\35E6B7011856420C844065A1599A0D682\notepad.pdb not found
SYMSRV: e:\mysyms\notepad.pdb\35E6B7011856420C844065A1599A0D682\notepad.pdb not found
DBGHELP: c:\Windows\SysWOW64\notepad.pdb - file not found
DBGHELP: notepad.pdb - file not found
<...>
DBGHELP: notepad - no symbols loaded