.Net PDB 文件是个什么东西,你了解吗?

楔子

天阶夜色凉如水,卧看牵牛织女星。七夕节愿天下有情人终成眷属。

形式

PDB全称(Program Data Base)
在微软的技术体系下,PDB分为两种,一种是托管的也就是编译.Net程序生成的托管PDB,另外一种是非托管的也就是C++/C等生成的非托管PDB.

PDB

非托的PDB,一开始是32个字节的固定头标志。
托管的PDB,则开始是PE DLL二进制的.Net目录下面的元数据头,包含了如下:

{
签名(Signature)
大版本号(MajorVersion)
小版本好(MinorVersion)
Reserved
版本号值的长度(VersionLength)
版本号的值(VersionString)
版本标志(Flags).Net数据流个数(NumberofStream)
}

后面的结构是:

{offset(数据流的相对偏移值)
size(数据流的长度)
Name(数据流的名称)
}

往复循环NumberofStream个数据流,数据流则分别为:

#Pdb,#~,#Strings,#US,#GUID,#Blob。

其中#~的格式需要注意,它的结构分为表头部和表:
表头部:

{
Reserved_1
MajorVersion
MinorVersion
HeapOffsetSizes
Reserved_2
MaskValid
MaskSorted
}

MaskValid表示有几个表:
假如其值为:0x000000900001547
则二进制表示为:1001 0000 0000 0000 0000 0001 0101 0100 0111
bit位总共有9个1 ,表示有9个表。从右至左分代表表1,表2,表3....等等。

00-Module01-TypeRef02-TypeDef03-FiledPtr04-Filed05-MethodPtr06-MethodDef07-ParamPtr08-Param09-MethodImpl10-MemberRef11-Constant12-CustomAttribute13-FieldMarshal14-DeclSecurity15-ClassLayout16-FieldLayout17-StandAloneSig18-EventMap19-EventPtr20-Event21-PropertyMap22-PropertyPtr23-Property24-MethodSemantics25-MethodImpl26-ModuleRef27-TypeSpec28-ImplMap29-FiledRVA30-ENCLog31-ENCMap32-AssemblyRef33-AssemblyProcessor34-AssemblyOS35-Assembly36- AssemblyRefProcessor37- AssemblyRefOS38- File39-ExportedType40-ManifestResource41- NestedClass42-GenericParam43-MethodSpec44-GenericParamConstraint

上面的最右边的第一个bit位为1,则表示00-Module这个表存在。但是Module表有几个呢?紧接着MaskSorted字段后面的就是Module表的个数。个数在内存中的表示占用了四个字节。上面总共有9个表。9*4 ==36.总共占了36个字节。MaskSorted后面跟着36个字节,然后就是Module表的内存空间了。

以上是部分核心内容