前言
熟悉.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内部细节,所以对于这个文件一直是一个迷。
您在阅读前请点击上面的“关注”二字,后续会为您提供更多有价值的相关内容,感谢您的支持。 电动车虽然总的来说是经济实惠,但从大的市场来看,电动车现在已经形成了“万亿消费大市场”,拥有很高的消费能力,而电动车品牌也非常多,从低端到高端,应有尽有,品牌和产品越丰富,对于车主而言,选择性更多了,...
微信目前严打的就四个方面;频繁加人;外挂软件;用户投诉和违法信息。当然,还有非常严重的连坐效应。所以,养好自己的号,至关重要,今天先和大家说说加人方式和他的上限规则。通讯录导入加人 微信目前严打的就四个方面;频繁加人;外挂软件;用户投诉和违法信息。当然,还有非常严重的连坐效应。所以,养好自己的号,...
很多人由于工作生活等原因,一个微信号远远不能满足我们日常使用,很多人都是生活一个号,工作一个号。虽然我们需要两个微信来用,但是还不想要办理多余的手机卡。这样我们原来是不是你都以为只 很多人由于工作生活等原因,一个微信号远远不能满足我们日常使用,很多人都是生活一个号,工作一个号。虽然我们需要两个微信...
NO.1Prada普拉达“潮流明星同款”普拉达于1913年成立于意大利米兰,其眼镜独特的时尚感、流行感成为许多明星装扮自己的标准配备。除了是一种时尚的表征,也是散发神秘魅力的利器,设计背后的生活哲学正巧契合现代人追求 NO.1 Prada普拉达“潮流明星同款” 普拉达于1913年成立于意大利...
武汉公积金利率下调至3.1%可以说是难得一见了,因为武汉公积金利率3.25%保持了很多年,如今下调后,每个月少还50元对个人来说也是一项不错的福利政策,原来在还房贷的朋友们需要等明年1月1日再正式执行。武汉公积金利率下调 武汉公积金利率下调至3.1%可以说是难得一见了,因为武汉公积金利率3.25%...
嘴唇长了疱疹是需要用药物涂抹治疗的,不管它的话就会好的比较慢,严重点的会引起嘴唇或者牙龈肿大,有的时候半边脸都是疼的。那么,嘴唇疱疹嘴唇肿大多久会消肿?一起来看看久久派带来的详细介绍吧!嘴唇长了疱疹还越来越肿怎么办患者 嘴唇长了疱疹是需要用药物涂抹治疗的,不管它的话就会好的比较慢,严重点的会引起嘴...
最贵的香料排名 对于那些习惯于烹饪和研究欧洲烹饪的人来说,番红花应该熟悉这种顶级香料。除了它是制作西班牙海鲜炖菜的必备材料外,它的高价也足以让人印象深刻。 番红花是世界上最昂贵的香料。如果按重量计算,它的价格有时甚至超过黄金,因此它被称为红金。但是你知道为什么番红花这么贵吗?为什么它能...
薯片里面的气体是氮气,这种是健康无害的,没有气味,可以放心食用,不需要担心哦!那么,薯片吃多了对身体有什么危害?一起来看看久久派带来的详细介绍吧!薯片里面的气体是什么气体芯片中的气体是氮气。氮清洁、无毒、干燥。可以防止 薯片里面的气体是氮气,这种是健康无害的,没有气味,可以放心食用,不需要担心哦!...
奥粒绒作为时下较为火热的面料之一,想必大家再逛直播间和小红书的时候都有它的推荐,但很多人在清洗该面料的衣物的时候却遇到有轻微缩水的问题,下面小编就和大家一起看看奥粒绒面料洗完缩水正常吗。奥粒绒面料洗完缩水正常吗奥粒绒面料 奥粒绒作为时下较为火热的面料之一,想必大家再逛直播间和小红书的时候都有它的推...
购置税减半政策是今年下半年推出的,已经有不少人都了解过了,但是近期打算买车的朋友们,可能还是不太了解购置税减半的意思。那么,购置税减半是直接优惠还是买车后返?一起来看看久久派带来的详细介绍吧!购置税减半30万是指导价还是 购置税减半政策是今年下半年推出的,已经有不少人都了解过了,但是近期打算买车的...
窦性心律不齐并不会影响入职或者公务员体检的,这个是属于一个比较心率问题,会在心电图时反映出来,平时需要多观察,一次体检证明不了什么,有可能是紧张导致,不用太放在心上。窦性心律不齐公务员体检能过关吗一般情况下,窦性心律不 窦性心律不齐并不会影响入职或者公务员体检的,这个是属于一个比较心率问题,会在心...
2023兔年搬新家怎么选吉日是大家经常讨论的,毕竟在我国只要一遇到大事,算日子指定是必不可少的一步,搬家就是这样,虽说搬新家和结婚相比甚是渺小,但是呢为了讨个吉利大家每每搬家的时候都会有各种的讲究。2023兔年搬新家怎么 2023兔年搬新家怎么选吉日是大家经常讨论的,毕竟在我国只要一遇到大事,算日...
科技与狠活是近期网红博主辛吉飞的口头禅,他的视频内容发布的基本都是视频安全问题,万万没想到,在外面吃的所谓的烤肠、肥牛卷以及羊汤等大补食物,其实很大概率都是商家们的投机取巧。科技与狠活是什么意思该梗出自视频作者辛吉飞创作 科技与狠活是近期网红博主辛吉飞的口头禅,他的视频内容发布的基本都是视频安全问...
鹅绒保存方法与注意事项,鹅绒被如何储存和注意事项。小编带你了解更多相关信息。 1、鹅绒被一定要完全晾晒干之后再进行保存,没有水分的情况下细菌不容易滋生。 2、鹅绒制品注意不要过于压缩,一般来说正常折叠并保存即可,但是必要的时候可以压缩,但是压缩度不要超过70%。 3、如果想长期储存,建...
水果保存方法和注意事项,水果保存方法介绍。小编带你了解更多相关信息。 1、购买时令水果,时令水果多半新鲜、品质佳,而且价钱又平实。不论何种水果,果实饱满、大小适中(表示果实发育完全)、外形完好、无碰伤及病斑等,都是基本的选择要点。而果实拿上手沉甸甸、具重量感,通常表示水分含量多,吃起来应是“香...