PDB 文件

PDB 文件PDB文件什么是PDB文件PDB(ProgramDataBase)即程序的基本数据,是VS编译链接时生成的文件,每个程序集(EXE或DLL)都有一个与之对应的PDB文件。DPB文件主要存储了VS调试程序时所需要的基本信息,主要包括源文件名、变量名、函数名、对应的行号等等。因为存储的是调试信息,所以一般情况下PDB文件是在Debug模式下才会生成。…

大家好,又见面了,我是你们的朋友全栈君。

PDB 文件


什么是 PDB 文件

PDB (Program Data Base) 即程序的基本数据,是 VS 编译链接时生成的文件,每个程序集(EXEDLL)都有一个与之对应的 PDB 文件。DPB 文件主要存储了 VS 调试程序时所需要的基本信息,主要包括源文件名、变量名、函数名、对应的行号等等。因为存储的是调试信息,所以一般情况下 PDB 文件是在 Debug 模式下才会生成。有了这个文件,我们才能对程序进行 断点调试 ,才能一步步执行程序。

为了直观地展示 PDB 文件的内容,我们来做一个小实验。创建一个 WPF 程序(取名为 CrashMe),在主窗体中放置一个按钮,在按钮的 Click 事件处理方法中编写如下代码。由于 DataContext 为空,所以会弹出一个 MessageBox 来显示异常堆栈。

private void CrashButton_OnClick(object sender, RoutedEventArgs e) { 
     try { 
     MessageBox.Show(new Window().DataContext.ToString()); } catch (Exception ex) { 
     MessageBox.Show(ex.StackTrace, "Exception"); } } 

如果将生成的 CrashMe.exeCrashMe.pdb 放一起,弹出的 MessageBox 内容如下左图所示;如果将 CrashMe.pdb 文件删除,内容如下右图所示。
对比两张图可以发现,带 CrashMe.pdb 的多了 文件位置代码行号,说明这些信息是记录在 pdb 文件中的。

这里写图片描述
PDB 文件

PDB 文件中都包含哪些内容

通过上一小节的例子,大家对 PDB 文件有了大概的了解,知道其中存储了 代码行号 等信息。对于 托管程序非托管程序,其 PDB 文件中存储的信息不尽相同,由于 托管程序Metadata 已经存储了 类型定义函数签名 等信息,所以其 PDB 中的内容相对较少。

  • Native C++ PDB 包含的信息
    • publicprivatestatic 函数地址
    • 全局变量的名称和地址
    • 参数和局部变量的名称以及它们在栈中的偏移量
    • classstructure 和数据的类型定义
    • Frame Pointer Omission 数据,用来在 x86上的 native 堆栈的遍历
    • 源代码文件的名称和行号
  • .NET PDB 包含的信息
    • 源代码文件名称和行数
    • 局部变量的名称和行数

PDB 是非公开的文件格式,我们不能直接获取其中的内容,只能通过微软提供的 Debug Interface Access SDK 来访问其中的信息。

PDB 的唯一性和重要性

每个程序集(PE 文件,EXEDLL)都会有一个与之对应的 PDB 文件,并且每次编译生成的 PE\PDB 文件都不同。编译器会生成一个 GUID 存储在 PE\PDB 文件中,以此来映射 PE 文件和 PDB 文件。由于 PDB 文件具有唯一性,因此 PDB 文件和 PE 文件同等重要,一旦丢失就不能通过重新编译来获取。注意:即使是同一份代码,在同一台计算机上编译,每次的生成的 PDB 都是不同的,一定要保存好发布版本的 PDB 文件。

PDB 文件

我们可以使用 DumpBin.exe 来从 PE 文件中获取 GUID 信息,在控制台中启动该程序,并传入 PDB文件/headers参数 即可。如下 部分控制台输出 所示,其中的 BBF232AA-7586-4659-B391-E19B0150E69F 即为此 PE 文件的 GUID 信息,另外还输出了与其对应的 PDB 文件的位置。

D:\CrashMe\bin\Debug>dumpbin.exe CrashMe.exe /headers
.....
  Debug Directories

        Time Type        Size      RVA  Pointer
    -------- ------- -------- -------- --------
    5AC1F73B cv           11C 00003838     1A38    Format: RSDS, {BBF232AA-7586-4659-B391-E19B0150E69F}, 1, C:\Users\Iron\Desktop\CrashMe\obj\Debug\CrashMe.pdb
......

接下来找到对应的 PDB 文件,检查其中 GUID 信息是否与 PE 一致,推荐使用 PdbInspector 来查看 PDB 文件的内部信息。

这里写图片描述

调试工具会通过路径和名字来查找 PDB 文件, 还会通过上面的 GUID 来确定 PDB文件PE文件 是否真正匹配。
调试工具加载 PDB 文件的顺序:

  • PE 文件所在的路径
  • PEhardcode 记录的 build 目录,例如 obj\debug\*.pdb
  • 根据 symbol server 的设置,在本地的 symbol servercache 中查找
  • 远程的 symbol server 中查找

参考资料

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/137008.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pycharm安装matplotlib_深度学习小白篇一:Anaconda的安装和配置

    pycharm安装matplotlib_深度学习小白篇一:Anaconda的安装和配置一、前言大家知道,深度学习需要使用Python来做开发,所以,想要进入深度学习的战场,我们就必须要先要有python的开发环境作为武器,否则只能干看,而无从下手。子曰:“工欲善其事,必先利其器。”,我们最直接的武器就是编译Python程序的开发环境,一般情况下,我们选择在Python官网下载对应版本的Python然后用记事本编写,再在终端进行编译运行即可。但是对于我这样懒的小白,我喜欢装一些方便的…

    2022年8月28日
    5
  • layUI展示树状treetable树形表格完整代码

    layUI展示树状treetable树形表格完整代码前言:因项目功能需要,在shiro权限管理模块中需要使用树状展示,前端使用的layUI框架,在官网的开发文档上没有找到树状表格的内容。只有树状菜单的文档:https://www.layui.com/doc/modules/tree.html树状表格步骤如下:1、首先下载所需调用的文件。下载链接:https://download.csdn.net/download/qq_35393472/10…

    2022年6月14日
    33
  • 一张图读懂分析型数据库AnalyticDB「建议收藏」

    一张图读懂分析型数据库AnalyticDB「建议收藏」

    2022年9月17日
    3
  • UVA – 11637 Garbage Remembering Exam (组合+可能性)

    UVA – 11637 Garbage Remembering Exam (组合+可能性)

    2022年1月4日
    40
  • Shiro面试题(二十道)[通俗易懂]

    Shiro面试题(二十道)[通俗易懂]SecurityManager才是实际的执行者。Realm:域,shiro从Realm获取安全数据(如用户、角色、权限),就是说SecurityManager要验证用户身份,那么它需要从Realm获取相应的用户进行比较以确定用户身份是否合法;Shiro提供了CredentialsMatcher的散列实现HashedCredentialsMatcher,和PasswordMatcher不同的是,它只是用于密码验证,且可以提供自己的盐,而不是随机生成盐,且生成密码散列值的算法需要自己写,因为能提供自己的盐。..

    2022年10月14日
    4
  • [设计模式]委派模式「建议收藏」

    github地址:https://github.com/1711680493点我进入github如需了解更多设计模式,请进入我的设计模式专栏委派模式委派模式不是23设计模式中的一种.与策略模式很相似.拥有以下三种角色抽象任务角色 委派者角色 具体任务角色委派模式,就是将任务发给委派者角色,委派者角色去委派具体任务角色委派模式对外隐藏了具体实现,仅将委派者角色暴露给外部委派模式和策略模式不同的是,委派者角色和具体任务角色都要继承/实现抽象任务角色Spring框架很

    2022年4月16日
    41

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号