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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 异或和左移的优先级_异或链表

    异或和左移的优先级_异或链表给定一个非负整数序列 a,初始长度为 N。有 M 个操作,有以下两种操作类型:A x:添加操作,表示在序列末尾添加一个数 x,序列的长度 N 增大 1。Q l r x:询问操作,你需要找到一个位置 p,满足 l≤p≤r,使得:a[p] xor a[p+1] xor … xor a[N] xor x 最大,输出这个最大值。输入格式第一行包含两个整数 N,M,含义如问题描述所示。第二行包含 N 个非负整数,表示初始的序列 A。接下来 M 行,每行描述一个操作,格式如题面所述。输出格式每个询问操

    2022年8月10日
    6
  • Cadence IC设计环境搭建( IC617+MMSIM151+Calibre2015)

    Cadence IC设计环境搭建( IC617+MMSIM151+Calibre2015)做IC版图设计,必不可少的环境搭建,是在Linux上进行开发,此类的安装教程网上比较少,自己也是跌跌撞撞,最终耗了一天的时间才装好呵呵呵~,期间主要参考了下面两篇文章。1.知乎文章2.简书文章3.安装需要的文件:链接:https://pan.baidu.com/s/14acWcuHvXGRkqf_8zkveDQ提取码:uahd以下为我的使用画面…

    2022年6月10日
    103
  • Windows下LaTeX安装教程与新手入门[通俗易懂]

    Windows下LaTeX安装教程与新手入门[通俗易懂]一、安装教程参考链接:https://blog.csdn.net/jackandsnow/article/details/88407909二、入门教程https://blog.csdn.net/Emily_Buffy/article/details/90180909写的非常详细,也很实用…

    2022年5月4日
    65
  • 用js来实现那些数据结构12(散列表)

    上一篇写了如何实现简单的Map结构,因为东西太少了不让上首页。好吧。。。这一篇文章说一下散列表hashMap的实现。那么为什么要使用hashMap?hashMap又有什么优势呢?hashMap是如何

    2022年3月25日
    36
  • Softmax classifier[通俗易懂]

    Softmax classifier[通俗易懂]Softmaxclassifier原文链接SVM是两个常见的分类器之一。另一个比较常见的是Softmax分类器,它具有不同的损失函数。如果你听说过二分类的Logistic回归分类器,那么Softmax分类器就是将其推广到多个类。不同于SVM将 f(xi,W) 的输出结果 (为校准,可能难以解释)作为每个分类的评判标准,Softmax分类器给出了一个稍直观的输出(归一化的类概率),并且也有

    2025年8月25日
    6
  • 2020/4/1微信小程序笔记

    2020/4/1微信小程序笔记1.微信小程序的登录流程 通过wx.login()获取登录凭证code 通过button组件的open-type=”getUserInfo”, 获取用户信息 将获取到的登录凭证和用户信息传递到自己的服务器 在自己的服务器上将登录凭证发送到微信的服务器上换取openid和session_key …

    2022年8月18日
    9

发表回复

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

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