调试代码时,调试器需要知道符号表的查询路径才可以定位到正确的符号表,就像链接器一样需要设置正确的链接路径,否则就会有链接错误。
一些编译器(如Microsoft Visual Studio)将符号文件放在与二进制文件相同的目录中。符号文件和检查的二进制文件包含路径和文件名信息。此信息通常使调试器能够自动查找符号文件。如果您正在构建可执行文件的计算机上调试用户模式进程,并且如果符号文件仍在其原始位置,调试器可以在不设置符号路径的情况下定位符号文件。
在大多数其他情况下,必须将符号路径设置为指向符号文件的位置。windbg使用".sympath"命令来设置符号路径,也可以在"File-->Symbol File Path"窗口中设置。
在此之前,我们先了解一些路径的规则:
调试器的符号路径是由多个目录路径组成的字符串,路径之间用分号分隔。
支持相对路径。但是,除非您总是从相同的目录启动调试器,否则您应该在每个路径之前添加一个驱动器号或网络共享。还支持网络共享。
对于符号路径中的每个目录,调试器在三个目录中查找。例如,如果符号路径包含c:\MyDir目录,而调试器正在查找DLL的符号信息,调试器首先在c: MyDir\symbols\ DLL中查找,然后在c:\MyDir\ DLL中查找,最后在c:\MyDir中查找。调试器然后对符号路径中的每个目录重复这个过程。最后,调试器查看当前目录,然后查看附加了\dll的当前目录。(调试器附加\dll、\exe或\sys,这取决于它正在调试的二进制文件。)
符号文件具有日期和时间戳。您不必担心调试器会使用它在这个序列中首先找到的错误符号。它总是在它正在调试的二进制文件上寻找与时间戳匹配的符号。
使用".sympath"会有很多种情景,可以从本地加载符号文件,可以从共享网络加载,也可以从符号服务器加载,同时可以选择缓存在本地(这样方便以后使用时加快加载时间)或者不缓存。
从本地计算机加载,符号文件放在两个不同的路径
.sympath C:/demo/x64/Debug;C:/demo/x64/Debug_bak.sympath C:/demo/x64/Debug.sympath+ C:/demo/x64/Debug_bak
从共享网络加载,可以缓存在本地;
//缓存在本地默认位置.sympath cache*;\\sharefolder//缓存在本地指定位置.sympath cache*C:\local_symbols;\\sharefolder
从符号服务器加载,可以缓存在本地,也可以不缓存;
//从符号服务器默认符号存储区加载符号.sympath srv*//从符号服务器指定符号存储区加载符号(微软符号服务器).sympath srv*https://msdl.microsoft.com/download/symbols//从符号服务器指定符号存储区加载符号,并缓存在本地.sympath srv*C:\server_symbols*https://msdl.microsoft.com/download/symbols//指定两个路径,一个可以手动存放修改的符号文件夹,一个存放来自服务器的符号表.sympath C:\regular_symbols;srv*C:\server_symbols*https://msdl.microsoft.com/download/symbols//结合使用cache*和srv*//从符号服务器加载符号,并缓存到本地指定目录.sympath cache*C:\local_symbols;srv*https://msdl.microsoft.com/download/symbols