Debugging Tools for Windows |
符号路径指定符号文件所在的目录。关于符号文件的更多概述信息,查看符号。
一些编译器(例如Microsoft Visual Studio)将符号文件和二进制文件放到同一个目录中。符号文件和调试版的二进制文件包含路径和文件名信息。这些信息一般用来让调试器自动寻找符号文件。如果在构建的机器上调试一个用户模式进程,并且符号文件还在原来的位置,调试器在没有进行设置的情况下就能定位符号文件。
大多数时候,都必须将符号路径设置为符号文件所在的位置。
调试器的符号路径由多个由分号分割的目录路径组成。
支持相对路径。但是,除非总是从同一个目录启动调试器,否则还是需要在每个路径前加上盘符和网络共享名。网络共享也可以被支持。
对于符号路径中的每个目录,调试器都会在里面查找三个目录。例如,符号路径包含c:\MyDir 目录,而调试器在查找一个DLL的符号信息,它会首先查找c:\MyDir\symbols\dll,然后c:\MyDir\dll,最后是c:\MyDir。调试器对符号路径中的每个目录都重复这个过程。最终它会在当前目录和加上\dll的子目录中查找。(调试器添加dll,exe或者sys取决于正在调试的二进制文件类型。)
无论如何,由于符号文件具有日期和时间戳,所以不用担心调试器因为按照这个顺序查找而使用错误的符号。它总是会查找时间戳和被调试的二进制文件匹配的符号。关于符号文件不不可用时的应对方法的信息,查看符号无效或丢失。
注意 如果连接到Internet或者公有网络,最有效的访问符号的方法是使用符号服务器。可以在符号路径中使用srv* 或symsrv* 字符串来使用符号服务器。更多信息,查看符号存储和符号服务器。
调试器默认会进行延迟符号加载(称为lazy symbol loading或deferred symbol loading)。这意味着符号仅在使用的时候才会被加载。但是,当符号路径改变时,所有已加载符号会立即重新加载。关于延迟符号加载以及如何启用和禁用它的更多信息,查看延迟符号加载。
可以在CDB和KD中使用-s 命令行选项关闭延迟符号加载。也可以使用ld (Load Symbols) 命令或者.reload (Reload Module)和/f选项强制加载符号。
使用下面的方法之一来控制符号路径:
如果使用了-sins 命令行选项,调试器忽略环境变量中的符号路径。
如果符号路径中包含字符串cache*localsymbolcache,那么指定的目录localsymbolcache 会用来保存从符号路径中该字符串右边指定的任何地方加载的符号。这使得可以对从任何位置下载的符号进行缓存,而不仅仅是从符号服务器下载的那些。
例如,如果使用下面的.sympath命令来设置了符号路径,那么 c:\mysymbols 将会用来保存从各个\\private 共享中下载的符号,但是不会缓存来自\\someshare的:
可以使用下面的初始设置来简单的连接到Microsoft 公共符号存储:
这样做之后,可以使用.sympath+ 命令来将其他路径添加到当前路径的右边。从这些新位置获得的符号都会缓存到c:\mysymbols 中,因为它们都位于cache* 字符串的右边;由于使用了常规的符号服务器语法(查看使用符号服务器),从符号服务器下载的符号会保存到c:\mysymbols中。
使用AgeStore工具可以删除指定日期以前的缓存文件,或者删除足够多的旧文件以将缓存大小控制到某个值之下。这在下游存储(downstream)太大的时候非常有用。详细信息,查看AgeStore。
关于符号服务器和符号存储的更多信息,查看符号存储和符号服务器。