.NET中pdb文件的作用是什么「建议收藏」

.NET中pdb文件的作用是什么「建议收藏」.PDB是ProgramDatabase的缩写,全称为“程序数据库”文件。我们使用它(更确切的说是看到它被应用)大多数场景是调试应用程序。目前我们对.PDB文件的普遍认知是它存储了被编译文件的调试信息,作为符号文件存在。 PDB文件寻路 如果我们观察VS启动调试加载模块和符号文件的过程,会发现它通常会从可执行文件或者DLL文件的相同目录中加载符号文件。这正是调试器寻找PDB文件的

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

 

.PDB是Program Database的缩写,全称为“程序数据库”文件。我们使用它(更确切的说是看到它被应用)大多数场景是调试应用程序。目前我们对.PDB文件的普遍认知是它存储了被编译文件的调试信息,作为符号文件存在。

 

PDB文件寻路

 

如果我们观察VS启动调试加载模块和符号文件的过程,会发现它通常会从可执行文件或者DLL文件的相同目录中加载符号文件。这正是调试器寻找PDB文件的第一选择。

如果在模块文件的相同目录下找不到匹配的PDB文件,会发生什么呢?我们在前文知道编译器在PE文件中硬编码了一个路径(比如:E:\test\c#\dumptest\dumptest\obj\x86\Debug\dumptest.pdb),这个路径就是调试器的第二个选择。对于对外发布的应用,很可能这两个路径下都找不到PDB文件。此时调试器会在本地的符号服务器缓存路径下寻找PDB文件。如果本地的符号服务器缓存路径下仍然找不到,它会调试器本身配置的符号服务器中寻找符号文件。图4是VS2010配置符号服务器和本地符号缓存路径的界面。

clip_image008

图4 VS2010配置符号存储

 

PDB与GAC

上面讲到的调试器寻找PDB文件的方式在大多数情况下都工作的很好,当我们遇到必须要讲编制之后的文件安装的GAC中的时候,情况开始变得有意思起来。当我们在本地编译并调试程序集的时候,即使程序集被安装到GAC中,调试器仍然能在编译目录下找到PDB文件,但是如果我们已经将Private Build的应用部署到其他机器上的时候,此时还想在被部署的机器上调试安装到GAC上的程序集,将会是一件很麻烦的事情。我们有两种方案来解决这个问题。

Private Build与Public Build的区别

private build, 用来表示在开发人员自己机器上生成的build;public build,表示在公用的build机器上生成的build。对于public build,需要symbol server存储所有的PDB,然后当用户报告错误的时候,debugger才可以自动地找到binay相应的PDB文件, visual studio 和 windbg都知道如何访问symbol server。在将PDB和binay存储到symbol server前,还需要对PDB运行进行source indexing, source indexing的作用是将PDB和source关联起来。

第一种方案是我们在GAC的目录中找到被安装的程序集,然后将PDB文件拷贝到该目录下。通常我们安装到GAC中的程序集会存在于类似这样的路径中:C:Windows\assembly\GAC_MSIL\Example\1.0.0.0__682bc775ff82796a,该示例目录中“Example”代表程序集的名称,“1.0.0.0”代表版本号,“682bc775ff82796a”代表程序集的Public Token。当你找到确切的目录,将PDB文件放到该目录下,调试器就可以加载符号文件了。

这里还有一种更好的方案,就是设置一个名为“DEVPATH”的系统环境变量。该环境变量设定一个磁盘目录作为其值,该目录将作为GAC的辅助目录存在,在GAC中查找程序集同样会搜索该目录。但是在这样的目录中程序集并不会执行版本检查,这是需要我们注意的地方。

使用DEVPATH,我们首先要选定一个目录,然后确保应用程序对它持有读、写权限。然后创建DEVPATH系统环境变量。当然这只是准备工作,我们还要告知.NET运行时,应用程序启用DEVPATH作为GAC的扩展目录。所以接下来我们在配置文件(APP.CONFIG,WEB.CONFIG,MACHINE.CONFIG)中添加如下配置:

<configuration>
<runtime>
<developmentMode developerInstallation=”true”/>
</runtime>
</configuration>

在你打开了development模式后,如果DEVPATH没有定义或路径不存在的话会导致程序启动时异常”Invalid value for registry”。而且如果在machine.config中开启DEVPATH的使用会影响其他的所有的程序,所以要慎重使用machine.config。

 

PDB文件会影响性能么?

可能有些人会觉得PDB文件的生成会对最终的应用程序的性能产生一定的影响,所以觉得在发布版中不应该生成PDB文件。

对于.NET应用程序来说,生成PDB文件不会影响编译器的优化,所以也完全不会影响应用的性能。只会对于生成的程序集中的一个DebuggableAttribute的属性产生影响。

 

 

文章转载自:      .NET中pdb文件的作用       http://www.studyofnet.com/news/208.html

 

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

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/137345.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • vscode 配置C语言编译环境(完美版)_C语言环境安装

    vscode 配置C语言编译环境(完美版)_C语言环境安装基本步骤要在VSCode中配置C语言环境,我们首先可能要一个VSCode(废话),所以先下载安装一个VSCode;然后肯定需要相关插件,因为VSCode不能直接拿来写C;然后任何语言的程序在运行前都需要编译,那还需要一个编译器,很可惜VSCode插件里面不自带,所以要自己下载然后配置;最后在VSCode中进行相关配置,就可以下载并安装VSCodevscode下载地址安装相关插件打卡后进入如下界面,选择这个C/C++的,然后点击install进行安装,大概几秒钟就好了,安装完成后in

  • code blocks使用方法总结「建议收藏」

    code blocks使用方法总结「建议收藏」下载和安装:官网地址:http://www.codeblocks.org/downloadstips:同一个版本有多个安装文件,官网上有对于各个文件的简要介绍。最好选择 mingw-se

  • python进阶(3)json文件与python字典的转化[通俗易懂]

    python进阶(3)json文件与python字典的转化[通俗易懂]序列化与反序列化按照某种规则,把内存中的数据保存到文件中,文件是一个字节序列,所以必须要把内存数据转换成为字节序列,输出到文件,这就是序列化;反之,从文件的字节恢复到内存,就是反序列化;pytho

  • Pytorch 转置卷积

    Pytorch 转置卷积环境使用Kaggle里免费建立的Notebook教程使用李沐老师的动手学深度学习网站和视频讲解小技巧:当遇到函数看不懂的时候可以按查看函数详解。卷积不会增大输入的高和宽,通常要么不变,要么减半。而转置卷积则可以用来增大输入高宽。假设忽略通道,步幅为1且填充为0。输入张量形状为nh×nwn_h\timesn_wnh​×nw​,卷积核形状为kh×kwk_h\timesk_wkh​×kw​。共产生nhnwn_hn_wnh​nw​个中间结果。每个中间结果都是一个(nh+k

  • ubuntu18.04安装ROS Melodic(最详细配置)[通俗易懂]

    ubuntu18.04安装ROS Melodic(最详细配置)[通俗易懂]设置软件源:国外的:sudosh-c’echo”debhttp://packages.ros.org/ros/ubuntu$(lsb_release-sc)main”>/etc/apt/sources.list.d/ros-latest.list’国内的,速度快:sudosh-c’./etc/lsb-release&&ec…

  • hadoop默认对3个副本的存储策略和执行策略:「建议收藏」

    hadoop默认对3个副本的存储策略和执行策略:「建议收藏」hadoop默认对3个副本的存储策略和执行策略:

发表回复

您的电子邮箱地址不会被公开。

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