Debugging Tools for Windows

符号和符号文件

当应用程序、库、驱动或操作系统被链接时,链接器在创建.exe.dll文件时还会创建一些其它文件,即符号文件

符号文件包含很多在运行时并不需要的数据,但是这些数据在调试过程中是非常有用的。

典型来说,符号文件可能包含:

这些数据都被称为符号。例如,一个符号文件myprogram.pdb 可能包含了数千个符号,包括全局变量、函数名以及数千个局部变量。通常,软件同时生成两个版本的符号文件:包含公有私有符号的完整符号文件,和一个只包含共有符号的有限制的文件。详细信息,查看公有和私有符号

调试时,要确认调试器能访问和调试目标关联的符号文件。交互式的调试和调试崩溃转储文件都需要符号。需要得到要调试的代码的合适的符号并加载到调试器中。

Windows符号

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 builddebug 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符号文件中,并且可以被调试器显示出来:

typedef struct _MY_DATA {
    . . .
    } MY_DATA;
typedef  MY_DATA *PMY_DATA; 

另一方面,下面这样的代码就不足够,因为MY_DATA 和PMY_DATA 都是在初始的typedef中定义的,因此MY_DATA 本身并没有被任何typedef 定义使用到:

typedef struct _MY_DATA {
    . . .
    } MY_DATA, *PMY_DATA; 

任何情况下,类型信息仅在完整符号文件中包含,而不在剥除了所有私有符号信息的符号文件中包含。更多信息,查看公有和私有符号

Build machine: CAPEBUILD