.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

 

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vue 父组件调用子组件的函数_vue子组件触发父组件方法

    vue 父组件调用子组件的函数_vue子组件触发父组件方法1、使用场景项目里将element-ui的el-upload写成公共组件方便调用,官方的before-upload方法用于处理上传前要做的事,如:比较文件大小,限制文件类型等,通过返回true或false控制是否上传。当该组件调用父组件方法,并且要能获取到父组件方法的返回值,如何实现?2、问题说明通常子组件调用父组件方法:this.$emit(方法名,传参1,传参2),但是此方法…

    2022年9月28日
    3
  • 单隐层前馈神经网络网络构造_前馈型神经网络常用于

    单隐层前馈神经网络网络构造_前馈型神经网络常用于这篇博客主要介绍神经网络基础,单隐层前馈神经网络与反向传播算法。神经网络故名思议是由人的神经系统启发而得来的一种模型。神经网络可以用来做分类和回归等任务,其具有很好的非线性拟合能力。接下来我们就来详细介绍一下但隐层前馈神经网络。首先我们来看一下神经元的数学模型,如下图所示:可以看到为输入信号,而神经元最终输出为,由此我们可以看到,单个神经元是多输入单输出的。但是从上图我们可以看到,…

    2025年6月19日
    2
  • 六周第四次课(11月23日) 复习 扩展

    六周第四次课(11月23日) 复习 扩展

    2022年3月12日
    40
  • Java 0xffffffff隐式类型转换的坑

    Java 0xffffffff隐式类型转换的坑一、场景复现项目需求,long的低32位存储ip地址,需要将ip信息展示成为字符串ip。publicstaticvoidmain(String[]args){longipLong=0x457145130A1901F6L;Stringip=longToIp(ipLong&0xffffffff);//取低32位System.ou…

    2022年5月13日
    37
  • Reaver无线破解工具——穷举PIN码破解简析

    Reaver无线破解工具——穷举PIN码破解简析部分老版路由器有WPS或叫QSS功能,并且在默认开启状态时,可使用此工具。PIN码共为8位,按431分段,总共穷举有11000种组合。通过获取到PIN码,并记住Bssid和PIN,后期可以通过一条命令爆出无线密码。容易碰到的问题:连接超时,卡住,路由自保护等。reave的进度表文件保存在/usr/local/etc/reaver/MAC地址.wpc或/etc/reaver/MAC…

    2022年6月1日
    58
  • 使用vue-cli创建项目_vuecli3教程

    使用vue-cli创建项目_vuecli3教程vue-cli创建项目上一篇我们安装了vue-cli,接下来我们就使用该脚手架进行创建项目1.进入一个目录,创建项目创建项目命令如下:vuecreate<ProjectName&g

    2022年8月7日
    4

发表回复

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

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