使用符号窗口(CTRL + S),我已设置WinDbg以从特定位置加载我的符号。
现在,当我附加调试器并尝试查看堆栈窗口时,似乎符号没有真正正确加载。
现在,当我使用!sym noisy 命令和 .reload / f 时,我从调试器获得以下信息:
那么,从第三张图片可以看出,为什么SYMSRV被定义了?为什么要在文件末尾添加GUID前缀?
如果没有guid windbg添加到路径上,那将会奏效。我做错了什么。
编辑:在进一步查看日志后,我看到调试器试图从本地驱动器加载符号。
答案 0 :(得分:0)
有几种不同的格式可以存储符号。这些是0层,2层和3层。
0层基本上是一个平面的文件列表,如果您刚刚构建了程序并且所有PDB都位于一个文件夹中,这是合适的。如果您输入c:\path
之类的本地路径或\\server
之类的服务器共享,WinDbg应考虑采用0层存储布局,但也可以尝试其他布局。
问题是您只能在0层存储中存储一个版本的PDB,这就是存在2层和3层符号存储的原因。当符号被添加到这样的商店时,它将考虑GUID,因此可以存储同一程序的多个版本。 2层和3层符号存储应以srv*
开头。在第9频道episode 87中解释了2层和3层商店之间的确切差异,并且可以将convert 2层商店添加到3层商店中。
不要将srv*
符号路径语法与SYMSRV:
调试输出混淆。恕我直言,SYMSRV:
只是symsrv.dll
的调试消息,所以无需担心。
加载符号的真相只能通过Process Monitor进行监控。即使在嘈杂模式下,也不会记录WinDbg搜索符号的所有位置。
除符号路径外,DLL还包含对PDB本地路径的引用,WinDbg将考虑此路径,与符号路径设置无关。