当前位置:首页 > 知识分享 > 正文内容

今日知识分享pdb文件编辑器

2年前 (2023-03-31)知识分享54

前言

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

介绍

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

什么是PDB

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

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

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

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

PDB文件包含什么?

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

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

源文件名字

源的行号。

源索引(后面部分解释)

要显示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来生成发布代码。

我们应该和二进制文件一起部署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,所以没有加载。

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

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

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

这怎么有用呢?

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

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

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

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

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

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

扫描二维码推送至手机访问。

版权声明:本文由阿龙玩站网发布,如需转载请注明出处。

本文链接:https://www.longge2021.cn/zhideyikan/20575.html

分享给朋友:

“今日知识分享pdb文件编辑器” 的相关文章

大话西游阵法,仙族八卦阵法大话

大话西游阵法,仙族八卦阵法大话

阵法是玩家和伙伴一起配合不同的站位来对抗各种怪物团的系统,是大话神仙的战斗乐趣之一,10种不同的阵法随着玩家主角的等级提升而逐步开放,阵法在提供不同站位的同时还可以给玩家提供相应阵法带来的额外属性加成效果和队伍先攻值。玩家可以在游戏中获得阅历奖励,并提升阵法奇术 1 天阵 是最早开放的阵法,提升天...

企业网站推广技巧有哪些(企业网站推广的5种技巧)

企业网站推广技巧有哪些(企业网站推广的5种技巧)

企业网站不仅需要SEO或竞价,当然全网推广方法也需要。一.企业官方自媒体微博/博客通过博客或微博直接引入,可以直接带来潜在的客户,省去了用户搜索查找的麻烦,可以方便的增加对应的网站 企业网站不仅需要SEO或竞价,当然全网推广方法也需要。 一.企业官方自媒体微博/博客 通过博客或微博直接引入,可...

沧州市属于哪个省(山东沧州市属于什么城市)

沧州市属于哪个省(山东沧州市属于什么城市)

在之前的文章中,作者和大家聊了一系列关于我国河北省各个城市区划形成的故事,例如石家庄市、保定市、邯郸市等等。今天,我们聊聊河北省的沧州市,沧州市经济发达、人口众多,属于河北省的第三 在之前的文章中,作者和大家聊了一系列关于我国河北省各个城市区划形成的故事,例如石家庄市、保定市、邯郸市等等。今天...

如何学习网络推广(学习网络推广的7种方法及平台)

如何学习网络推广(学习网络推广的7种方法及平台)

网络推广的目的就是把产品通过各种免费或收费渠道展示给网民的一种推广方式。网络推广的载体是互联网,离开了互联网的推广就不算是网络推广,下面是小编在最近工作中整理的一些方法及平台:在发 网络推广的目的就是把产品通过各种免费或收费渠道展示给网民的一种推广方式。网络推广的载体是互联网,离开了互联网的推广就...

自媒体如何赚钱快(分享15种自媒体赚钱快的方法)

自媒体如何赚钱快(分享15种自媒体赚钱快的方法)

做自媒体一天收入相当于我一年工资了,走,做自媒体去。也是从这两次事件开始,自媒体火了。可是,两年过去了,99%的自媒体人还在苦苦探索盈利模式。做自媒体,收这样高级别的广告费,除了文 做自媒体一天收入相当于我一年工资了,走,做自媒体去。也是从这两次事件开始,自媒体火了。可是,两年过去了,99%的自媒...

羊了个羊游戏规则(羊了个羊第二关怎么过)

羊了个羊游戏规则(羊了个羊第二关怎么过)

羊了个羊游戏的玩法规则是什么?玩家在玩这款游戏的时候,刚开始很多人都不知道这款游戏怎么玩,由于不清楚游戏的规则,所以很多玩家在初期都会走很多弯路,今天游戏鸟小编给大家带来游戏的规则 羊了个羊游戏的玩法规则是什么?玩家在玩这款游戏的时候,刚开始很多人都不知道这款游戏怎么玩,由于不清楚游戏的规则,所以...

1050美元换多少人民币(10美元对于美国人来说)

1050美元换多少人民币(10美元对于美国人来说)

堂弟在美国生活了将近20年了,是平时很少回来,前一阵子突然回到国内还有些不适应,习惯了花美元的他冷不丁的用上了人民币,我就向他打听了一下人民币和美元的差别。体现在购买力上的话,通常美国那边称重是按照每磅来算的,我们拿猪肉 堂弟在美国生活了将近20年了,是平时很少回来,前一阵子突然回到国内还有些不适...

农历十月初一为什么要早回家(农历十月初一是鬼节吗)

农历十月初一为什么要早回家(农历十月初一是鬼节吗)

十月初一送寒衣是很多北方地区都有的习俗,但由于该节日作为四大鬼节之一,所以很多讲究都会出现在我们生活中,因此农历十月初一为什么要早回家成了大家都在问的,下面小编就和大家一起看看农历十月初一是鬼节吗。农历十月初一为什么要早 十月初一送寒衣是很多北方地区都有的习俗,但由于该节日作为四大鬼节之一,所以很...

洗好的红薯能放到第二天蒸吗(洗了的红薯可以隔天蒸吗)

洗好的红薯能放到第二天蒸吗(洗了的红薯可以隔天蒸吗)

红薯含有丰富的维生素、矿物质以及膳食纤维等,适量食用对身体有一定的好处,很多人都会在家蒸红薯吃,蒸红薯一般都是要清洗干净的,洗干净的红薯最好尽快蒸熟吃,这样味道最美味,也可以放在第二天蒸,一般只要不去皮,都是可以隔天蒸煮 红薯含有丰富的维生素、矿物质以及膳食纤维等,适量食用对身体有一定的好处,很多...

女性为什么会得口唇疱疹(嘴唇老是长疱疹怎么回事啊)

女性为什么会得口唇疱疹(嘴唇老是长疱疹怎么回事啊)

嘴唇老是长疱疹一般是属于单纯疱疹,这种是没有办法彻底治愈的,只能使用药物涂抹治疗,当换季时,身体免疫力下降就会出现,所以大家平时需要补充维生素C,增强体质,以防嘴唇疱疹的出现。女性为什么会得口唇疱疹女性口唇疱疹是由单纯疱 嘴唇老是长疱疹一般是属于单纯疱疹,这种是没有办法彻底治愈的,只能使用药物涂抹...

iPhone14双十一官网会降价吗(苹果14双11大概会是多少钱)

iPhone14双十一官网会降价吗(苹果14双11大概会是多少钱)

iPhone14双十一官网一般是没有优惠的,但其他电商平台是会有折扣的,每年都是如此,更何况今年的iPhone14销量并不是很好,所以想入手新机的朋友们可以期待双十一的折扣哦!iPhone14双十一官网会降价吗不会,官网 iPhone14双十一官网一般是没有优惠的,但其他电商平台是会有折扣的,每年...

世界十大著名香料植物?(最贵的香料排名)

世界十大著名香料植物?(最贵的香料排名)

最贵的香料排名 对于那些习惯于烹饪和研究欧洲烹饪的人来说,番红花应该熟悉这种顶级香料。除了它是制作西班牙海鲜炖菜的必备材料外,它的高价也足以让人印象深刻。 番红花是世界上最昂贵的香料。如果按重量计算,它的价格有时甚至超过黄金,因此它被称为红金。但是你知道为什么番红花这么贵吗?为什么它能...

羊奶保存方法和注意事项(羊奶保存方法和注意事项有哪些)

羊奶保存方法和注意事项(羊奶保存方法和注意事项有哪些)

羊奶保存方法和注意事项,羊奶保存方法和注意事项有哪些。小编带你了解更多相关信息。 1、保存鲜羊奶应该放在阴凉的地方,放在冰箱里保存时间是最长的。 2、避免让鲜羊奶被阳光曝晒或照射灯光,日光、灯光均会破坏羊奶中的数种维生素,也会使其丧失芳香。 3、羊奶放在冰箱里,瓶盖要盖好,以免串味。瓶装鲜...

鸭蛋保存方法和注意事项(鸭蛋的保存方法介绍)

鸭蛋保存方法和注意事项(鸭蛋的保存方法介绍)

鸭蛋保存方法和注意事项,鸭蛋的保存方法介绍。小编带你了解更多相关信息。 1、如果是夏天比较热的时候,可以放进冰箱冷藏室里存放,注意不要冷冻,冻过的鸭蛋很不好吃。一般放在冰箱上层冷藏室就行了。可以把熟鸭蛋做真空处理,能保证鸭蛋放比较长的时间。这需要专门的仪器,如果鸭蛋比较多可去附近加工厂做真空处...

蜜蜂保存方法和注意事项(蜜蜂如何保存)

蜜蜂保存方法和注意事项(蜜蜂如何保存)

蜜蜂保存方法和注意事项,蜜蜂如何保存。小编带你了解更多相关信息。 1、蜂蜜中富含有机酸等酸性物质,事实上蜂蜜的pH值介于3~4之间,因此不能用铜、铁等金属容器长期储存,否则蜂蜜容易因氧化反应而提前变质,长期储存蜂蜜最好的容器是陶瓷容器和玻璃容器,另外干净且无毒的塑料容器也适合用来储存蜂蜜。...