符号路径

DbgHelp 库使用符号搜索路径查找调试符号(.pdb 和 .dbg 文件)。 搜索路径可以由一个或多个由分号分隔的路径元素组成。

指定搜索路径

若要指定符号处理程序在何处搜索符号文件的磁盘目录,请调用 SymSetSearchPath 函数。 或者,可以在 SymInitialize 函数的 UserSearchPath 参数中指定符号搜索路径。

SymInitial ize 中的 UserSearchPath 参数,SymSetSearchPath 中的 SearchPath 参数 将指针指向指定路径或用分号分隔的路径的以 null 结尾的字符串。 符号处理程序使用这些路径搜索符号文件。 如果此参数 NULL,则符号处理程序将搜索包含要为其搜索符号的模块的目录。 否则,如果此参数指定为非NULL 值,则符号处理程序首先在搜索模块目录之前搜索应用程序设置的路径。 如果设置_NT_SYMBOL_PATH或_NT_ALT_SYMBOL_PATH环境变量,符号处理程序将按以下顺序搜索符号文件:

  1. _NT_SYMBOL_PATH环境变量。
  2. _NT_ALT_SYMBOL_PATH环境变量。
  3. 包含相应模块的目录。

若要检索搜索路径,请调用 SymGetSearchPath 函数。

程序数据库 (.pdb) 文件的搜索路径不同于调试 (.dbg) 文件的路径。 该算法由符号库的功能确定。 默认情况下,Microsoft Visual C/C++创建Microsoft格式符号,从图像中去除这些符号,并将其放置在单独的 .pdb 文件中。 通常,.pdb 文件将位于包含可执行映像的目录中。 Visual C/C++在可执行映像中嵌入 .pdb 文件的绝对路径。 如果符号处理程序在该位置找不到 .pdb 文件,或者如果 .pdb 文件已移动到另一个目录,则符号处理程序将使用 .dbg 文件描述的搜索路径查找 .pdb 文件。

Path 元素类型

有三种类型的路径元素。

标准路径元素

通过查找路径元素指定的目录的根目录来搜索标准路径元素。 符号处理程序还会查找与要查找符号的模块文件扩展名匹配的“symbols”子目录中。 这通常是“dll”、“exe”或“sys”。 最后,它会在名为“symbols”的子目录中查找,其目录与扩展名称相同。 例如,如果符号路径元素为“c:\mySymbols”,并且正在搜索符号的文件为“boo.dll”,则搜索以下目录。

  • c:\mySymbols
  • c:\mySymbols\dll
  • c:\mySymbols\symbols\dll

符号处理程序使用此逻辑搜索不符合 符号服务器缓存(如下所述)的条件的任何路径元素。

符号服务器路径元素

符号服务器 路径元素使用特殊技术,该技术可以找到与有问题的模块完全匹配的符号。 有关更多详细信息,请参阅 使用 SymSrv

如果路径元素以文本“srv*”开头,则符号处理程序将路径元素视为符号服务器。

注意

如果未指定“srv*”文本,但实际路径元素是符号服务器存储,则符号处理程序将如同指定了“srv*”。 符号处理程序通过在指定路径的根目录中搜索名为“pingme.txt”的文件的存在来做出此决定。

 

缓存路径元素

缓存 路径元素是符号服务器路径元素的变体。

此目录与其他任何符号服务器一样进行搜索。 但是,如果此处找不到符号,并且该符号位于符号路径链更远的路径元素中,则将复制符号并将其存储在此元素中指定的符号服务器中。

如果路径元素以文本“cache*”开头,符号处理程序会将路径元素视为缓存元素。 若要在“c:\myCache”中指定缓存,请使用“cache*c:\myCache”的符号路径元素。

示例搜索路径

若要查看此工作原理,请设置此搜索路径。

cache*c:\myCache;srv*\\symbols\symbols

下面是使用上面列出的搜索路径搜索 ntdll.pdb 时符号处理程序的详细输出的列表。

DBGHELP: .\ntdll.pdb - file not found
DBGHELP: .\dll\ntdll.pdb - file not found
DBGHELP: .\symbols\dll\ntdll.pdb - file not found
SYMSRV: c:\myCache\ntdll.pdb\0F7FCF88442F4B0E9FB51DC4A754D9DE2\ntdll.pdb not found
SYMSRV: ntdll.pdb from \\symbols\symbols: 10497024 bytes - copied
DBGHELP: c:\myCache\ntdll.pdb\0F7FCF88442F4B0E9FB51DC4A754D9DE2\ntdll.pdb already cached
DBGHELP: ntdll - private symbols & lines
c:\myCache\ntdll.pdb\0F7FCF88442F4B0E9FB51DC4A754D9DE2\ntdll.pdb

前三行输出显示符号处理程序处理 .的第一个路径元素。 这是一个标准路径元素。

第四行显示符号处理程序,该符号服务器使用符号服务器查找 cache*c:\myCache 的第二个路径元素(即缓存路径元素)中的文件。

第五行显示该文件位于 srv*\\symbols\symbols的第三个路径元素中,它是符号服务器路径元素。

第六行显示文件已复制到缓存。

文件从缓存中打开的最后两行。