Debugging Tools for Windows |
当应用程序、库、驱动或操作系统被链接时,链接器在创建.exe和.dll文件时还会创建一些其它文件,即符号文件。
符号文件包含很多在运行时并不需要的数据,但是这些数据在调试过程中是非常有用的。
典型来说,符号文件可能包含:
这些数据都被称为符号。例如,一个符号文件myprogram.pdb 可能包含了数千个符号,包括全局变量、函数名以及数千个局部变量。通常,软件同时生成两个版本的符号文件:包含公有和私有符号的完整符号文件,和一个只包含共有符号的有限制的文件。详细信息,查看公有和私有符号。
调试时,要确认调试器能访问和调试目标关联的符号文件。交互式的调试和调试崩溃转储文件都需要符号。需要得到要调试的代码的合适的符号并加载到调试器中。
Windows 2000将它的符号保存在扩展名为.pdb和.dbg的文件中。Windows XP和之后版本的Windows仅使用.pdb文件。Windows驱动程序可以使用其中之一。
编译器和链接器控制符号格式。Visual C++ 5.0链接器同时创建.pdb和.dbg符号文件 — .dbg文件实质上指向.pdb文件。Visual C++ 6.0和之后的Visual Studio版本的链接器将所有符号都放入.pdb文件中。
Windows操作系统构建有两个不同版本。发行版 (或零售版)的二进制文件相对较小,而调试版(checked build或debug build) 二进制文件要大一些,并带有更多调试符号。这些版本都有两种符号文件。当在Windows上调试目标时,必须有和目标机器上的Windows版本匹配的符号文件。
下表列出了在标准Windows符号树中包含的目录:
目录 | 包含的符号文件 |
---|---|
ACM | Microsoft音频压缩管理器(Microsoft Audio Compression Manager )文件 |
COM | 可执行文件(.com) |
CPL | 控制面板程序 |
DLL | 动态链接库文件(.dll) |
DRV | 驱动文件(.drv) |
EXE | 可执行文件(.exe) |
SCR | 屏幕保护程序文件 |
SYS | 驱动文件(.sys) |
所有代码中用typedef定义的结构都会包含,只要在程序中实际用过它们。但是,在头文件中定义但是没有实际使用到的符号不会包含在.pdb中,并且调试器不能访问它们。如果要让这样的类型在调试器中可用,可以将它们作为typedef声明的输入。例如,如果代码中有下面的内容,MY_DATA 结构会保存在.pdb符号文件中,并且可以被调试器显示出来:
. . .
} MY_DATA;
typedef MY_DATA *PMY_DATA;
另一方面,下面这样的代码就不足够,因为MY_DATA 和PMY_DATA 都是在初始的typedef中定义的,因此MY_DATA 本身并没有被任何typedef 定义使用到:
. . .
} MY_DATA, *PMY_DATA;
任何情况下,类型信息仅在完整符号文件中包含,而不在剥除了所有私有符号信息的符号文件中包含。更多信息,查看公有和私有符号。