认识符号文件
一、什么是符号文件
符号文件(Symbol Files)是一个数据信息文件,它包含了应用程序二进制文件(比如:EXE、DLL等)调试信息,专门用来作调试之用,最终生成的可执行文件在运行时并不需要这个符号文件,但你的程序中所有的变量信息都记录在这个文件中。所以调试应用程序时,这个文件是非常重要的。用 Visual C++ 和 WinDbg 调试程序时都要用到这个文件。 在 Windows 系统中,符号文件以 .pdb 为扩展名,比如:每个 Windows 操作系统下有一个 GDI32.dll 文件,编译器在编译该 DLL 的时候会产生一个 GDI32.pdb 文件,一旦你拥有了这个 PDB 文件,那么便可以用它来调试并跟踪到 GDI32.dll 内部。该文件和二进制文件的编译版本密切相关,比如修改了 DLL 的输出函数,再编译该 DLL,那么原先的 PDB 文件就过时了,不能再用老的 PDB 文件来做调试工作,而必须使用最新的 PDB 文件版本。
二、符号文件的生成和获取
- 自己编写的代码
在链接配置里做如下配置 - Windows系统相关程序的符号
从微软服务器下载http://msdl.microsoft.com/download/symbols下载,在vs里配置
三、符号文件包含哪些信息
3.1、Native C++ PDB包含了如下的信息:
- public,private 和static函数地址;
- 全局变量的名字和地址;
- 参数和局部变量的名字和在堆栈的偏移量;
- class,structure 和数据的类型定义;
- Frame Pointer Omission 数据,用来在x86上的native堆栈的遍历;
- 源代码文件的名字和行数;
3.2、.NET PDB只包含了2部分信息:
- 源代码文件名字和行数;
- 和局部变量的名字;
- 所有的其他的数据都已经包含在了.NET Metadata中了;
四、符号文件分类
- 私有符号文件
包含所有程序调试信息,如第三节讲到的信息,VC默认生成的就是私有符号文件 - 公有符号文件
在编译链接时,设置/PDBSTRIPPED 选项将创建第二个程序数据库 (PDB) 文件。 此 PDB 文件省略您不希望交付给客户的符号。 第二个 PDB 文件仅包含公共符号:对象文件的列表和可执行文件中由它们参与构成的部分;用于遍历堆栈的帧指针优化 (FPO) 调试记录。去除了如下信息:类型信息,行号信息、基于对象文件的 CodeView 符号,如函数、局部变量和静态数据的符号。
五、符号文件系统
有两个常见的符号文件系统。 在本文档中,这些将称为当前系统并旧系统。
当前符号文件系统
在当前系统中,始终有两个文件: 可执行文件和.pdb 文件。 .Pdb 文件包含所有符号。 可执行文件包含.pdb 文件的指针。- 旧的符号文件系统
在旧系统中,可执行文件和符号文件可以排列两个不同的方式:
1、可执行文件和.pdb 文件。 在这种方案,大多数符号信息是.pdb 文件中。 可执行文件中包含的符号信息的其余部分。 可执行文件还包含指向.pdb 文件的指针。
2、可执行文件、.pdb 文件和.dbg 文件。 .Pdb 文件是两个文件排列方式相同: 它包含的符号的大多数。 符号信息的其余部分是.dbg 文件中。 在可执行文件是没有对应符号信息。 可执行文件包含一个指向.dbg 文件,并且.dbg 文件包含.pdb 文件的指针。