Windbg从更改的位置加载符号

时间:2016-11-01 08:57:37

标签: c++ windbg symbols debug-symbols

使用符号窗口(CTRL + S),我已设置WinDbg以从特定位置加载我的符号。

enter image description here

现在,当我附加调试器并尝试查看堆栈窗口时,似乎符号没有真正正确加载。

enter image description here

现在,当我使用!sym noisy 命令和 .reload / f 时,我从调试器获得以下信息:

enter image description here

那么,从第三张图片可以看出,为什么SYMSRV被定义了?为什么要在文件末尾添加GUID前缀?

如果没有guid windbg添加到路径上,那将会奏效。我做错了什么。

编辑:在进一步查看日志后,我看到调试器试图从本地驱动器加载符号。

enter image description here

1 个答案:

答案 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将考虑此路径,与符号路径设置无关。