PDB Files: What Every Developer Must Know

http://www.wintellect.com/CS/blogs/jrobbins/archive/2009/05/11/pdb-files-what-every-developer-must-know.aspx

PDB文件:每个开发人员都必须知道的

一 什么是PDB文件

大部分的开发人员应该都知道PDB文件是用来帮助软件的调试的。但是他究竟是如何工作的呢,我们可能并不熟悉。本文描述了PDB文件的存储和内容。同时还描 述了debugger如何找到binay相应的PDB文件,以及debugger如何找到与binay对应的源代码文件。本文适用于所有的Native和 Managed的开发人员。

在开始前,我们先定义2个术语:private build, 用来表示在开发人员自己机器上生成的build;public build,表示在公用的build机器上生成的build。private build相对来说比较简单,因为PDB和binay在相同的地方,通常地我们遇到的问题都是关于public build。

所有的的开发人员需要知道的最重要的事情是”PDB文件跟源代码同样的重要“, 没有PDB文件,你甚至不能debugging。对于public build,需要symbol server存储所有的PDB,然后当用户报告错误的时候,debugger才可以自动地找到binay相应的PDB文件, visual studio 和 windbg都知道如何访问symbol server。在将PDB和binay存储到symbol server前,还需要对PDB运行进行source indexing, source indexing的作用是将PDB和source关联起来。

接下来的部分假设有已经设置好了symbol server和source server indexing。TFS2010中可以很简单地完成对一个新的build的source indexing 和 symbol server copying。

二 PDB文件的内容

正式开始PDB的内容,PDB不是公开的文件格式,但是Microsoft提供了API来帮助从PDB中获取数据。

Native C++ PDB包含了如下的信息:

* public,private 和static函数地址;

* 全局变量的名字和地址;

* 参数和局部变量的名字和在堆栈的偏移量;

* class,structure 和数据的类型定义;

* Frame Pointer Omission 数据,用来在x86上的native堆栈的遍历;

* 源代码文件的名字和行数;

.NET PDB只包含了2部分信息:

* 源代码文件名字和行数;

* 和局部变量的名字;

* 所有的其他的数据都已经包含在了.NET Metadata中了;

三 PDB如何工作

当你加载一个模块到进程的地址空间的时候,debugger用2中信息来找到相应的PDB文件。第一个毫无疑问就是文件的名字,如果加载 zzz.dll,debugger则查找zzz.pdb文件。在文件名字相同的情况下debugger还通过嵌入到PDB和binay的GUID来确保 PDB和binay的真正的匹配。 所以即使没有任何的代码修改,昨天的binay和今天的PDB是不能匹配的。可以使用dempbin.exe来查看binary的GUID。

在VisualStudio中的modules窗口的symbol file列可以查看PDB的load顺序。第一个搜索的路径是binary所在的路径,如果不在binary所在的路径,则查找binary中hardcode记录的build目录,例如obj\debug\*.pdb, 如果以上两个路径都没有找到PDB,则根据symbol server的设置,在本地的symbol server的cache中查找,如果在本地的symbol server的cache中没有对应的PDB,则最后才到远程的symbol server中查找。通过上面的查找顺序我们可以看出为什么public build和private build的PDB查找不会冲突。

对于private build有时我们需要在别人的机器上debug的情况,需要将相应的PDB与binary一起拷贝,对于加入GAC的.NET的binary,需要将PDB文件拷贝到C:\Windows\assembly\GAC_MSIL\Example\1.0.0.0__682bc775ff82796a类似的binary所在的目录。另一个变通的方法是定义环境变量DEVPATH,从而代替使用命令GACUTIL将binary放入GAC中。在定义DEVPATH后,只需要将binary和PDB放到DEVPATH的路径,在DEVPATH下的binary相当于在GAC下。使用DEVPATH,首先需要创建目录且对当前build用户有写权限,然后创建环境变量DEVPATH且值为刚才创建的目录,然后在web.config,app.config或machine.config中开启development模式,启动对DEVPATH的使用

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

最后开发人员需要知道的是源代码信息是如何存储在PDB文件中的。对于public builds,在运行source indexing tool后,版本控制工具将代码存储到你设置的代码cache中。对于private builds,只是存储了PDB文件的全路径,例如在c:\foo下的源文件mycode.cpp,在pdb文件中存储的路径为c:\foo\mycode.cpp。对于private builds可以使用虚拟盘来增加PDB对绝对路径的依赖,例如可以使用subst.exe将源代码路径挂载为V:,在别人的机器上debug的时候也挂载V:。

完!

vc 运行不了pdb文件什么鬼_PDB文件:每个开发人员都必须知道的(转)相关推荐

  1. pdb文件 PDB文件:每个开发人员都必须知道的 .NET PDB文件到底是什么?

    pdb文件包含了编译后程序指向源代码的位置信息,用于调试的时候定位到源代码,主要是用来方便调试的. 在程序发布为release模式时,建议将 pdb文件删除, 同时,对外发布的时候,也把 pdb删除, ...

  2. 【vs调试】PDB文件:每个开发人员都必须知道的

    PDB文件:每个开发人员都必须知道的   一 什么是PDB文件 大部分的开发人员应该都知道PDB文件是用来帮助软件的调试的.但是他究竟是如何工作的呢,我们可能并不熟悉.本文描述了PDB文件的存储和内容 ...

  3. PDB文件:每个开发人员都必须知道的

    PDB Files: What Every Developer Must Know http://www.wintellect.com/CS/blogs/jrobbins/archive/2009/0 ...

  4. 【vs调试】PDB 文件:每个开发人员都必须知道的

    [vs调试]PDB文件:每个开发人员都必须知道的 GDB:The GNU Project Debugger, 将会包含代码中符号(自定义变量, 数据类型), 还有函数调用或类引用的关联性, 有了pdb ...

  5. vc 运行不了pdb文件什么鬼_PDB是什么文件_PDB文件怎么打开_PDB文件能删吗

    PDB是什么文件?一些用户在操作电脑的时候,可能会碰到后缀名为.pdb的文件,该文件是程序数据库文件,相信很多用户对于PDB文件都不了解,下面小编将给大家科普下PDB文件知识,请大家耐心阅读下文. P ...

  6. java 扫描文件测试_适用于Java开发人员的微服务:安全测试和扫描

    java 扫描文件测试 1.简介 本教程的这一部分专门讨论安全性测试,将围绕被证明在软件开发领域(包括微服务 )中无价的测试策略进行总结. 尽管软件项目中的安全方面每天都变得越来越重要,但是令人惊讶的 ...

  7. VC++ 单文档项目显示打开的文件

    VC++ 新建一个单文档项目以后,直接运行:效果如下: 界面上的菜单,工具条,都是单文档项目框架自动生成: 然后选择 文件 菜单中的 打开 文件:点击后,并看不到任何反应:但是此时框架肯定进行了一些动 ...

  8. VC 运行时库 /MD、/MDd 和 /MT、/MTd

    这里总结下他们的区别,后面的那个'd'是代表DEBUG版本,没有'd'的就是RELEASE版本了. 首先说/MT /MT是 "multithread, static version &quo ...

  9. win10自带vc运行库吗?

    运行库是系统中非常重要的组件,像一些绿化版的软件如果电脑没有运行库就无法运行,但是也不一定就要安装VC++运行库一般而言,将相关的.dll文件复制出来,放在相关程序所在目录中就可以了.比如小编从网上下 ...

最新文章

  1. linux路由介绍,Linux的路由表详细介绍
  2. android auto 字体大小,Android中给TextView字体大小用dp还是sp?dp和sp有什么区别?
  3. iOS UI基础-6.0 UIActionSheet的使用
  4. 【多元域乘法】多项式乘法电路原理及MATLAB详解
  5. C排序算法:(二)冒泡排序
  6. avocado自动化测试框架
  7. Lucene 和 Elastic
  8. Windows Internet Explorer 7 正式发布
  9. 23种设计模式(六)单一职责之桥模式
  10. 回首2018 | 分析型数据库AnalyticDB: 不忘初心 砥砺前行
  11. 一键去除AutoCAD图形乱码的问题
  12. 【数学】积分法推导求圆的周长、弧度
  13. HTML网页设计结课作业 榆林子州 HTML5响应式旅游景区网站模板
  14. 【硬件通信协议】4. 详细解析CAN总线通信协议
  15. win10删除*某些设置由你的组织来管理
  16. 用计算机计算下面各题,四下计算机练习题汇总
  17. iOS开发周报:新一代 iPhone 可能取消耳机插口,Facebook 发布 tvOS SDK
  18. Java生成XML数字签名
  19. STC15系列单片机外设参考资料
  20. hilink互联技术_hilink是什么意思

热门文章

  1. 【Kaggle】AMEX信用违约预测比赛总结
  2. 上海亚商投顾:沪指逼近3400点 CPO概念股再度爆发
  3. JavaScript 数学曲线—等角螺线
  4. 解决Ubuntn安装cal命令
  5. 通信方式——NFC概述(一)
  6. 1433 mssql 安全_如何开启MSSQL1433端口?
  7. 有一种高级的情商,叫“不抬杠”
  8. (一)页面跳转的四种方法及页面跳转中相对路径问题
  9. 关于webview中安卓和苹果页面缩放不同的问题
  10. 完整的项目管理流程,看清PMP42个过程的执行顺序