zoukankan      html  css  js  c++  java
  • 认识符号文件

    一、什么是符号文件

    符号文件(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 文件的指针。
  • 相关阅读:
    学习C#的一些笔记
    SQL高级应用
    SQL SERVER 视图
    ES5 Study
    面试官技巧
    WebServicexml操作
    用JS和HTML写自己的文本编辑器
    解决Win7 x64 VS2010调试网站出现 vs2010 未能将脚本调试器附加到计算机上的进程。已附加了一个调试器
    Microsoft.Practices.Unity实现代码依赖注入、XML依赖注入和AOP切面编程
    无法对数据库'XXX' 执行删除,因为它正用于复制"的解决方法
  • 原文地址:https://www.cnblogs.com/yilang/p/11190771.html
Copyright © 2011-2022 走看看