cc682/NetRoc
http://netroc682.spaces.live.com/
设置路径和加载文件
要有效的进行调试,调试器需要尽可能多地访问和目标机或目标程序相关的信息。
很多情况下,调试器可以自己定位需要的文件。但是,如果没能定位这些文件,可以手动设置寻找的路径。也可以在任何时候加载源码文件,不管源码放在什么地方。
本节包含以下主题:
可执行映像路径
符号路径
源代码路径
可执行映像路径
可执行文件是处理器可以运行的二进制文件。这些文件一般有.exe、.dll或.sys扩展名。可执行文件也称为模块,特别是当它是一个更大的应用程序的组成部分时。Microsoft Windows操作系统执行文件之前,会先把它加载到内存中。内存中的可执行文件拷贝称为可执行映像或映像。
注意 这些术语有时候并不是精确使用的。例如,有些文档将"映像"用于实际的磁盘文件。同样,基于Windows的应用程序所称的可执行文件名(executable name)一般包含了文件扩展名,但是这些程序的模块名(module name)一般不包含文件扩展名。
Windows内核和HAL也有特殊的模块名。例如,模块nt 是Ntoskrnl.exe 文件。
可执行映像路径指定可执行的二进制文件所在的目录。
大多数情况下调试器都知道可执行文件的位置,所以不需要指定该路径。
但是,有时候这个路径是需要的。例如,内核模式小内存转储文件没有包含发生停机错误(即崩溃)时内存中所有可执行文件。同样,用户模式的minidump文件也没有包含应用程序的二进制内容。如果设置了可执行文件路径,调试器就可以找到这些二进制文件。
可执行映像路径语法
调试器的可执行映像路径由多个由分号分割的目录路径组成。
支持相对路径。但是,除非总是从同一个目录启动调试器,否则还是需要在每个路径前加上盘符和网络共享名。网络共享也可以被支持。
调试器会递归搜索可执行映像路径。即调试器会搜索路径列表中的目录的所有子目录。
控制可执行映像路径
可以通过如下方法之一来设置可执行映像路径:
如果使用了-sins 命令行选项,调试器忽略环境变量中的可执行映像路径。
符号路径
符号路径指定符号文件所在的目录。关于符号文件的更多概述信息,查看符号。
一些编译器(例如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选项强制加载符号。
控制符号路径
使用下面的方法之一来控制符号路径:
- 启动调试器之前,使用_NT_SYMBOL_PATH 和_NT_ALT_SYMBOL_PATH 环境变量设置路径。符号路径通过将_NT_ALT_SYMBOL_PATH添加到_NT_SYMBOL_PATH之后来创建。(一般通过_NT_SYMBOL_PATH来设置路径。但是有时候可能希望使用_NT_ALT_SYMBOL_PATH来覆盖这些设置,例如拥有共享的符号文件的私有版本时。) 如果这些环境变量中有无效目录,调试器跳过这个目录。
- 启动调试器时,使用-y 命令行选项设置。
- 用.sympath 命令显示、设置、修改或添加路径。如果使用源码服务器, .symfix (Set Symbol Store Path)命令和.sympath 类似,但是会保存输入。
- (仅WinDbg) 使用File | Symbol File Path 命令或按下CTRL+S来显示、设置、修改或添加路径。
如果使用了-sins 命令行选项,调试器忽略环境变量中的符号路径。
Cache*<localsymbolcache>
Cache*<localsymbolcache> 可以将从符号服务器任何指定目录结构下载的符号保存到本地缓存中。该命令对符号路径中在它右边的所有目录起效,所以只能指定一次。例如,可以使用下面的.sympath 命令将\\private 共享中的所有.pdb文件保存缓存到C:\symbols 中。
.sympath \\share\that\cachestar\ignores;cache*c:\symbols;\\private\binary\symbol\location;\\private\test\build\symbol\share
作为联系,可以试验下面的示例设置。
_NT_SYMBOL_PATH=srv*c:\symbols*\\symbols\symbols;cache*c:\symbols
这样,之后添加的所有符号都会自动保存到本地缓存中。
如果本地缓存变得过大,可以使用调试工具包中的AgeStore 工具来清除最近未使用的符号。用下面的命令查看AgeStore 的语法。
agestore.exe /?
关于符号服务器和符号存储的更多信息,查看使用符号服务器和符号存储。
AgeStore 命令的更多信息,查看工具和文档列表。
源码路径
源码路径指定C和C++源代码文件所在的目录。
如果在构建可执行文件的机器上调试用户模式进程,并且源码还保存在原始位置,则调试器可以自动定位这些文件。
大多数其它情况下,都必须设置源码路径或者加载单个源码文件。
进行通过调试器的远程调试时, 调试服务器会使用源码路径。如果使用WinDbg作为调试器,每个调试客户端都有它自己的本地源码路径。所有和源码相关的命令都访问本地计算机上的源码文件。在所有需要使用源码命令的客户端或者服务器上都需要设置合适的路径。
多路径系统同样启用一个调试客户端来使用源码相关命令而并不实际和其他客户端或服务器共享源代码。这种系统对于某个用户需要访问私有或保密代码的时候非常有用。
可以随时加载某个源码文件,不管源码路径是什么内容。
源码路径语法
调试器的源码路径由多个由分号分割的目录路径组成。
支持相对路径。但是,除非总是从同一个目录启动调试器,否则还是需要在每个路径前加上盘符和网络共享名。网络共享也可以被支持。
注意 如果连接到公有网络,最有效的访问源码文件的方式是使用源码服务器。在源码路径中使用srv* 字符串来使用源码服务器。更多信息,查看使用源码服务器。
控制源码路径
使用下列方法之一来控制源码路径:
也可以通过下面的方法直接打开或关闭源码文件:
关于如何使用源码文件的更多信息,查看源码模式调试。