PDB文件格式

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的使用
<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:。

完!

时间: 2025-01-14 22:38:07

PDB文件格式的相关文章

RSDS pdb格式

本描述了“RSDS”或“DS”类型的pdb(程序数据库)文件的格式,这些文件是由Miscrosoft的link.exe从版本7及更高版本发出的. 什么是PDB文件? 如果选择了/DEBUG选项或/DEBUG:FULL选项,则最新的Microsoft链接器将在链接时创建程序数据库(pdb)文件.pdb文件包含有关创建可执行文件的信息,还包含最新CodeView格式的符号信息.可执行文件包含本地计算机上pdb文件的路径和文件名,以及标识码,以便可以找到正确的pdb文件.pdb文件本身的格式和最新的C

.NET初学者推荐课程 asp.net错误代码大全

错误 CS0001 编译器内部错误错误 CS0003 内存溢出错误 CS0004 提升为错误的警告错误 CS0005 编译器选项后应跟正确的参数错误 CS0006 找不到动态链接的元数据文件错误 CS0007 .Net 环境初始化错误错误 CS0008 从文件中读取元数据错误错误 CS0009 不能打开元数据文件错误 CS0010 名字空间与类型的声名不能同名错误 CS0011 引用的类找不到基类错误 CS0012 找不到引用类型的定义错误 CS0013 向文件中保存元数据时发生未知错误错误 C

分子对接技术

转载于 https://mp.weixin.qq.com/s/asAJDttAvsCLGd3PPU2agQ 分子对接(Molecular Docking)理论 所谓分子对接就是两个或多个分子之间通过几何匹配和能量匹配相互识别找到最佳匹配模式的过程.分子对接对酶学研究和药物设计中有重要的应用意义. 分子对接计算是在受体活性位点区域通过空间结构互补和能量最小化原则来搜寻配体与受体是否能产生相互作用以及它们之间的最佳结合模式.分子对接的思想起源于Fisher E的"钥匙和锁模型",主要强调的

C# 错误代码

附录B 错误CS0001 编译器内部错误 错误CS0003 内存溢出 错误CS0004 提升为错误的警告 错误CS0005 编译器选项后应跟正确的参数 错误CS0006 找不到动态链接的元数据文件 错误CS0007 .Net 环境初始化错误 错误CS0008 从文件中读取元数据错误 错误CS0009 不能打开元数据文件 错误CS0010 名字空间与类型的声明不能同名 错误CS0011 引用的类找不到基类 错误CS0012 找不到引用类型的定义 错误CS0013 向文件中保存元数据时发生未知错误

关于towhee 回答zhang_jaj的问题-转载小木虫

以下是zhang_jaj 的问题:你好,我想用towhee做NVT下argon气在surface面上nucleation过程,希望你给一些指导,首先我想把potential选为LJ,surface与particles也是LJ作用,1)问题是这个surface是需要用particles来make吗,如果是的话那么构成它的particles该怎么固定2 )或者,直接用towhee里面的LJ9-3 wall吗,想知道这种wall是与particles怎么作用的,它不是用小粒子构成的吗?3)模拟完成后,

Towhee-经验分享

以下是zhang_jaj 的问题:你好,我想用towhee做NVT下argon气在surface面上nucleation过程.首先我想把potential选为LJ,surface与particles也是LJ作用, 1)问题是这个surface是需要用particles来make吗,如果是的话那么构成它的particles该怎么固定 2 )或者,直接用towhee里面的LJ9-3 wall吗,想知道这种wall是与particles怎么作用的,它不是用小粒子构成的吗? 3)模拟完成后,液体与固体的

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

PDB文件:每个开发人员都必须知道的 PDB Files: What Every Developer Must Knowhttp://www.wintellect.com/CS/blogs/jrobbins/archive/2009/05/11/pdb-files-what-every-developer-must-know.aspx PDB文件:每个开发人员都必须知道的 一 什么是PDB文件 大部分的开发人员应该都知道PDB文件是用来帮助软件的调试的.但是他究竟是如何工作的呢,我们可能并不熟悉

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

PDB Files: What Every Developer Must Knowhttp://www.wintellect.com/CS/blogs/jrobbins/archive/2009/05/11/pdb-files-what-every-developer-must-know.aspx PDB文件:每个开发人员都必须知道的 一 什么是PDB文件 大部分的开发人员应该都知道PDB文件是用来帮助软件的调试的.但是他究竟是如何工作的呢,我们可能并不熟悉.本文描述了PDB文件的存储和内容.同

PDB Files: What Every Developer Must Know

Reference:  http://www.wintellect.com/blogs/jrobbins/pdb-files-what-every-developer-must-know Most developers realize that PDB files are something that help you debug, but that's about it. Don't feel bad if you don't know what's going on with PDB fil