.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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 用 Java 实现拦截器 Interceptor 的拦截功能

    用 Java 实现拦截器 Interceptor 的拦截功能Java里的拦截器是动态拦截action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。在AOP(Aspect-OrientedProgramming)中拦截器用于在某个方法或字段被访问之前进行拦截,然后在之前或之后加入某些操作。  此外,拦截

    2022年5月13日
    25
  • [WinForm]C# ListView用法详解[通俗易懂]

    [WinForm]C# ListView用法详解[通俗易懂]转载自:http://blog.csdn.net/chen_zw/article/details/7910324#一ListView类1常用的基本属性2常用方法3常用事件二ListView的五种视图Details视图1列表头创建记得需要先创建列表头2添加数据项3显示项4移除某项5行高设置利用imageList实现6清空运行效果largeIcon视图运行效果SmallIcon视图运行效果List视图…

    2022年7月26日
    5
  • Oracle没有WM_CONCAT函数的解决办法

    Oracle没有WM_CONCAT函数的解决办法解决ORA-00904:”WMSYS”.”WM_CONCAT”WM_CONCAT是oracle的非公开函数,并不鼓励使用,新版本oracle并没有带此函数,需要手工加上。1、下载根据下方链接下载三个文件:owmctab.plb、owmaggrs.plb、owmaggrb.plbhttps://download.csdn.net/download/qq_39997939/741429102、执行用sqlplus登录,执行下载的脚本sqlplus/assysdba

    2022年6月14日
    91
  • 2000款商务通用PPT模板免费下载[通俗易懂]

    2000款商务通用PPT模板免费下载[通俗易懂]0001-大气黑金年终工作总结PPT模板.zip:https://baippt.ctfile.com/fs/5288276-3454633710002-简约大气工作总结PPT模板.zip:https://baippt.ctfile.com/fs/5288276-3454633380003-商务风职业规划PPT模板.zip:https://baippt.ctfile.com/fs/5288…

    2022年7月24日
    15
  • MATLAB画图语句_excel绘图技巧

    MATLAB画图语句_excel绘图技巧转载画图技巧matlab调用OriginMatlab作出的图普遍没有Origin作出的美观好看,而且导出为eps或emf格式后会有各种奇怪的Bug。目前普遍采用的一种方法是,将Matlab数据导出为mat文件后再导入Origin中手工作图,这种方式需要不少重复性劳动,并不是一种很完美的解决方案。前几天偶然看到Origin提供了COM接口可供Matlab调用,于是就研究了下可否用Matla…

    2022年9月15日
    4
  • 量化交易策略建模综述

    量化交易策略建模综述一、常见的features(一)timelags(二)(三)(四)CCICCI=(Typicalprice-MAofTypicalprice)/(0.015*StandarddeviationofTypicalprice)(五)EaseofMovement(EVM)(六)Distancemoved=((CurrentHigh+CurrentLow)/2-(PiorHigh+PiorLow)/2)(七)MA(八)Rate

    2022年6月26日
    43

发表回复

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

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