pdb文件,在.net项目中生成的pdb(程序数据文件)是什么文件?

前言

熟悉.Net开发的朋友会知道,项目在编译时,除了可执行的.exe文件外,在运行目录常常会生成.pdb的文件,好多人都不知道这个文件是干什么用的,今天就详细介绍一下。

介绍

本文帮助那些处于初级或中级水平的开发人员,但是他们对PDBs的重要性以及为什么需要它们没有太多的理解。

什么是PDB

PDB是程序数据库文件的首字母缩写。

PDB文件通常是在编译期间从源文件创建的。它存储 模块所有符号的列表,其中包含它们的地址,可能还有文件的名称和声明符号的行。

为什么PDB是一个单独的文件?

这些符号本来可以很容易地嵌入到二进制文件中,但反过来又会使二进制文件的大小变得更大(有时是几兆字节)。为了减少文件的大小,现代编译器和早期的大型机调试系统将符号信息输出到一个单独的文件中,对于Microsoft编译器,这个文件称为.PDB文件。

PDB文件包含什么?

以下是PDB文件存储的一些重要信息:

局部变量名——为了证明pdb包含局部变量名,我们将利用反射器将其pdb在与程序集相同的文件夹中进行反编译。反射工具有一个选项,称为“显示PDB符号”,如屏幕截图中所示,当检查时也加载相应的PDB用于该程序集。当您检查选项,你可以看到反编译的代码相同的变量名,你的实际代码,但在缺乏PDB或未经检查该选项时,局部变量反编译的代码中,字符型变量名会被替换成“str”,数值型的则是“num”等等。

在.net项目中生成的pdb(程序数据文件)是什么文件?

源文件名字

源的行号。

源索引(后面部分解释)

要显示PDB包含源文件名称和源文件的行号(第2和第3),首先在相同的文件夹中运行以下控制台应用程序,然后删除PDB文件。

namespace UnderstandingPDBs{ class Program { static void Main(string[] args) { try { int sum = Add(5, 10); decimal value = Divide(10, 0); } catch { } } private static int Add(int i, int j) { return i + j; } private static decimal Divide(int i, int j) { try { return i / j; } catch (Exception ex) { LogError(ex); throw ex; } } private static void LogError(Exception ex) { using (var txtWriter = new StreamWriter(@"dump.txt",true)) { string error = "Exception:" + ex.Message + Environment.NewLine + "StackTrace:" + ex.StackTrace if(ex.InnerException!=null) error=error+"INNER EXCEPTION:"+ex.InnerException; txtWriter.WriteLine(error); } } }}

如果目录中存在PDB文件,下面是应用程序抛出的异常:

Exception:Attempted to divide by zero. StackTrace: at UnderstandingPDBs.Program.Divide(Int32 i, Int32 j) in C:UsersRishiDocumentsVisual Studio 2010ProjectsUnderstandingPDBsProgram.cs:line 33

如果没有PDB文件,异常信息如下:

Exception:Attempted to divide by zero. StackTrace: at UnderstandingPDBs.Program.Divide(Int32 i, Int32 j) ---------

显然,带有PDB的文件显示了异常被抛出的类的行号和文件名。

调试器如何加载PDB ?

Visual Studio调试器假设PDB文件位于与DLL或EXE相同的文件夹下。每一次程序集编译生成 唯一的PDB文件,这意味着,即使没有代码改变,也不能使用在以前的编译中创建的PDB文件。调试器通过将PDB中的特定GUID与二进制的GUID进行比较,发现PDB是否跟二进制文件相匹配。这个Guid在编译过程中嵌入到二进制和PDB中,并将PDB与二进制文件紧密连接。

Visual Studio中不同的Build设置。

Visual Studio有3种不同的Build选项,可以控制调试符号的生成:

none:PDB文件将不会生成。

pdbonly:调试符号只能在PDB文件中,而不是二进制文件中。

Full:与PDB二进制中的符号一起也包含一些调试符号。

Full是Visual Studio中设置的默认选项。

参考MSDN文档:

如果您使用/调试:full,请注意,JIT优化代码的速度和大小会受到一定的影响,并且对代码质量的影响很小。我们建议/调试:pdbonly或没有PDB来生成发布代码。

在.net项目中生成的pdb(程序数据文件)是什么文件?

我们应该和二进制文件一起部署PDBs吗?

如果交付件的大小不是问题,最好将PDB和其他二进制文件一起部署,因为它有助于提供更多关于异常的信息,就像我们在上面的例子中看到的那样。这些PDBs对于某些用户在某些情况下会非常有用,因为某些用户没有PDB会使生活变得困难。

这并不是说您必须拥有PDBs和二进制部署来获得关于异常的额外信息。同样可以使用符号服务器和源索引来实现,我将在下面的主题中讨论。

和PDB安全风险吗?

任何使用DLL/EXE的人都可以很容易地进行反向工程,使用诸如反射器之类的工具来生成带有或不带PDB的源代码。因此,在这种情况下,不提供PDB将不会有多大帮助。

如果PDB被部署,并且用户无法访问二进制文件,那么向他们显示堆栈跟踪信息并让他们知道应用程序的内部信息不是一个好主意。

Symbol Server

符号服务器

符号服务器用来存储被调试器所知道的pdb文件,可以用来查找更详细的调用堆栈信息。

我们可以使用symstore.exe设置自己的符号服务器,它允许调试器找到与二进制相关的实际PDB。symstore.exe包含在窗口包的调试工具中。

微软还保留了符号服务器,我们可以通过从微软的符号服务器加载PDBs来使用它。

如何以及为什么加载微软符号存储?

当您在debug点和open Modules窗口停止执行时(如下所示),您将会发现所有的dll(外部或内部)加载到该断点之前,但是默认情况下的符号状态将显示“无法找到或打开pdb文件”,除了您的pdb。这些是Microsoft BCL二进制文件,因为我们的调试器找不到相关的PDBs,所以没有加载。

在.net项目中生成的pdb(程序数据文件)是什么文件?

要加载这些符号,可以去Debugging->Symbols ,并检查微软的符号服务器,并将缓存符号作为任何共享文件夹在这个目录中提供,以便所有的开发人员都可以使用它。

由于这些二进制文件是您的应用程序之外的,所以您还需要在 Debugging->General 菜单中取消 “Enable just my Code” 。

在下面的截图中,您可以看到我已经加载了符号,现在符号的状态显示了“ Symbols loaded ”。

在.net项目中生成的pdb(程序数据文件)是什么文件?

这怎么有用呢?

您可以在代码中放置断点,并在没有加载符号的情况下查看调用堆栈。

下图显示了没有加载符号的调用堆栈,它只是将我的方法和BCL的方法显示为[外部代码]。

在.net项目中生成的pdb(程序数据文件)是什么文件?

在加载了这些符号之后,调用栈将在断点之前显示所有的方法调用(参见下图)。当我们想知道调用的外部方法是什么时,它当然是有帮助的,这样它就可以使用反射器或调试拆解来分析,而在我们的应用程序中,由于外部代码而导致某些行为更改的任何特定问题。

在.net项目中生成的pdb(程序数据文件)是什么文件?

与符号服务器一样,也有称为源服务器的东西,用于检索用于构建任何特定应用程序的源文件的确切版本。在构建时,二进制文件可以被索引,并且该信息存储在PDB文件中,它帮助源服务器找到确切的源文件。

您可以检查MSDN了解更多关于符号和源存储。

PDB文件是微软专有格式的文件,也没有提供什么文档详细介绍。因为微软并未公布PDB内部细节,所以对于这个文件一直是一个迷。

本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:dandanxi6@qq.com

(0)
上一篇 2022-12-11 10:50
下一篇 2022-12-11 10:57

相关推荐

  • 部编版二年级下册语文字词专项训练及答案

    今天老师给二年级孩子们整理了《字词》类知识点合集,包括照样子写词语、近反义词、填空、多音字组词、量词等题型,收藏起来给孩子多看看,打好学习基础。 《字词》专项练习 一、按要求整理词…

    2023-05-19
  • 大s和汪小菲的结果到底是什么关系

    本来以为一翻骂战发酵几天之后,汪小菲和大S闹剧应该下去了。汪小菲11月25又发文,转发贴出了委托律师的消息:“收到法院裁定,法院裁准同意您在提供担保金162万5千元后,就停止大S申…

    2023-04-01
  • 爱情公寓原班人马新剧

    爱情公寓电视剧官方平台宣布《爱情公寓5》于2019年8月24日杀青,晒出了所有主创工作人员的合照,场面非常热闹。 爱情公寓电视剧官方平台表示《爱情公寓5》历时136天的拍摄,终于结…

    2022-12-13
  • 友情链接的作用,网络推广友情链接有用吗安全吗

    在做大连网站优化的时候,不仅要做好站内的优化,同时还要提升网站内容的质量,另外有些seo人员会通过添加友情链接的方式来提升网站在搜索引擎中的排名,通过高质量的友情链接可以让网站在搜…

    2022-12-01
  • 莫言的作品有哪些,莫言最好的作品是哪部

    关于莫言哪部作品最值🉐️阅读,但凡读过他作品的人肯定会有许多不同的想法,因为莫言属于天才型的作家,文凭不高,顶多是高中文化,但是却著作等身且每一部都还不错,当然他也有读者不太喜欢的…

    用户投稿 2022-11-20
  • 大家怎么看待现在的洪荒少女傅园慧这个人

    洪荒少女傅园慧,小盘对她真是再喜欢不过。 从在比赛现场,大胆直率说出自己的感受,再到各种表情包的诞生,这位为国争光的游泳女健将,让大众对运动员们的背后的艰苦生活更近了一步。 如今,…

    2023-08-30
  • 为何13岁男孩持刀弑母

    近日,湖南省益阳市沅江泗湖山镇一名六年级学生(12岁男孩),在家中持刀杀害了亲生母亲。 经警方初步审讯,犯罪嫌疑人的动机是管教太严格,在一次母亲打骂自己时难以忍受,遂痛下杀手,足足…

    2023-09-28
  • 香港歌星陈百强到底是怎么死的传闻他染上了艾滋病,是真的吗

    陈百强刚刚在娱乐圈站稳脚跟就突然去世了。没有人知道陈百强是怎么死的。事实上,娱乐圈里猝死的人不少,陈百强只是其中之一。但不得不说,他们的死因不会因为死亡的时间而被遗忘。所以陈百强的…

    2022-12-10
  • it分为哪几种专业更详细一点

    IT 是什么工作?IT职业介绍,IT工作主要是指软件开发、硬件开发、网络、制造类应用系统类等工程师岗位,IT职业就是传统的IT行业的工作职位,IT行业的发展前景永无止境。 IT定义…

    2022-11-22
  • 如何评价《长相守》这部剧情(长相守追剧时间)

    影视圈寒冬的今天,不少实力派演员甘当绿叶,为新人们做陪衬已不新鲜,但像《长相守》这般全靠配角撑场的电视剧还是让人刮目相待! 一人分饰两角的于小彤随时一幅睁不开眼的模样,女主又是十项…

    2022-12-30