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的使用 
<configuration> 
   <runtime> 
      <developmentMode developerInstallation="true"/> 
   </runtime> 
</configuration>

在你打开了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:。

完!

感谢,Thanks!

作者:iTech
出处:http://itech.cnblogs.com/ 
本文版权归作者iTech所有,转载请包含作者签名和出处,不得用于商业用途,非则追究法律责任!

【vs调试】PDB文件:每个开发人员都必须知道的相关推荐

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

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

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

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

  3. C#9.0 每个开发人员都必须知道的4个特性

    在 .NET 5.0 的发布中,不仅统一了框架,微软还在C#9.0中推出了一些新特性. 本版本中,印象深刻的功能: Init-only setters (初始化设置器) Records (记录) To ...

  4. requestmapping注解访问404_开发人员都必须知道的Spring注解概览

    作者:飒然Hang 来源:rowkey.cn/blog 前言 从Java5.0开始,Java开始支持注解.Spring做为Java生态中的领军框架,从2.5版本后也开始支持注解.相比起之前使用xml来 ...

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

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

  6. java 开发人员工具_每个Java开发人员都应该知道的10个基本工具

    java 开发人员工具 大家好,我们已经到了2019年的第二个月,我相信你们所有人都已经制定了关于2019年学习以及如何实现这些目标的目标. 我一直在撰写一系列文章,为您提供一些知识,使您可以学习和改 ...

  7. 每个Java开发人员都应该知道的10个基本工具

    大家好,我们已经到了2019年的第二个月,我相信你们所有人都已经为2019年的学习目标以及如何实现这些目标制定了目标. 我一直在撰写一系列文章,为您提供一些知识,使您可以学习和改进以成为2019年更好 ...

  8. 正在搜索开发人员模式安装包_每个 Java 开发人员都应该知道的 10 个基本工具...

    大家好,我们已经在 2019 年的第 9 个月,我相信你们所有人已经在 2019 年学到了什么,以及如何实现这些目标.我一直在写一系列文章,为你提供一些关于你可以学习和改进的想法,以便在 2019 年 ...

  9. 程序员们都必须知道的8种通用数据结构

    数据结构是一种特殊的组织和存储数据的方式,可以使我们可以更高效地对存储的数据执行操作. 数据结构在计算机科学和软件工程领域具有广泛而多样的用途. 几乎所有已开发的程序或软件系统都使用数据结构. 此外, ...

最新文章

  1. 生活智慧:奇特的人生法则
  2. 炸金花的JS实现从0开始之 -------现在什么都不会(1)
  3. case study
  4. 复制并重命名文件_视频文件太大怎么办?快速压制视频只需一招,好多大咖都在用...
  5. 键盘录入学生信息,保存到集合中
  6. oracle函数 INITCAP(c1)
  7. 阿里云基于NVM的持久化高性能Redis数据库
  8. 第三章 JVM内存回收区域+对象存活的判断+引用类型+垃圾回收线程
  9. 星际二 地图制作过程
  10. WCF入门(八)---WCF服务绑定
  11. WebService:JAX-WS实现WebService
  12. redis LRU淘汰策略原理
  13. 通信工程师考试基本情况及经验分享
  14. centos7 查看cpu温度
  15. 计算机控制人脑的电影,推荐20部全球经典烧脑电影,考验你智商的时刻到了(上)...
  16. 测试自己移动速度的软件,Superspeed一键测速脚本 测试服务器到国内电信/联通/移动速度...
  17. ajax hover,jQuery / 使用hover()和toggle()切换事件 - 汇智网
  18. 009 二维随机变量分布 min max 习题
  19. etcdctl的使用[v3版本]
  20. MySQl安装与学习,内附SQlyog

热门文章

  1. 【036】基于51单片机的电子时钟与秒表Proteus仿真设计
  2. 集思广益,玩魔方~~
  3. 爱情是男人事业的核动力,七夕和大家分享!
  4. mysql 按汉字拼音首字母排序或聚合
  5. 王牌战争服务器维修要维修好久,请求辛苦的工作人员修复王牌战争以下的问题!感谢你们!...
  6. 200-详解C++的new和delete
  7. 让945GC(GMA950)原生支持1440X900分辨率的方法
  8. 对话搜狗陈伟,揭秘搜狗AI合成主播背后的前沿技术
  9. CV13 图像分辨率操作(图像金字塔与resize()函数)
  10. 棠玥寕现身机场 耐心给粉丝签名 举动太暖心了