一、什么是符号文件

符号文件(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 文件的指针。

标签: none

添加新评论