C# PDB文件在第二次编译时变大,然后保持相同大小
使用以下简单文件:C# PDB文件在第二次编译时变大,然后保持相同大小,c#,.net,csc,C#,.net,Csc,使用以下简单文件: using System; public class Program{ [STAThread] public static void Main(string[] args){ Console.WriteLine("Boo"); } } 然后使用以下命令: csc /target:exe /debug:pdbonly HelloWorld.cs 如果运行此命令且PDB不存在,则PDB文件大小为12KB
using System;
public class Program{
[STAThread]
public static void Main(string[] args){
Console.WriteLine("Boo");
}
}
然后使用以下命令:
csc /target:exe /debug:pdbonly HelloWorld.cs
如果运行此命令且PDB不存在,则PDB文件大小为12KB。否则,如果PDB文件存在,则新文件大小为14KB
Microsoft (R) Visual C# Compiler version 4.0.30319.17929
.NET 4.5
有人知道怎么解释吗
更新:
每次编译都会创建一个新的不同程序集 如果您想深入了解到底什么是不同的,那么您可能想看看这篇文章:“ 不同汇编之间的差异:
- 时间戳
- 没有行动
- ModuleDef GUID
- 调试属性
- 第二时间戳
- PDB-GUID
- 目录差异
- 几个4字节偏移量(DataDirectory.Debug、SizeOFData、AddressOfRawData、PointerToRawData、DataDirectory.MetaData)
我不确定第一次编译和第二次编译之间额外的2kb大小差异来自何处。但我想可能有一些信息在第一次构建时没有包含,但在以后的每次编译中都会添加。我的答案很简单,但可能不太准确。 让我们在PDB文件上使用一个调试器工具: 唯一的区别是
PdbAge
字段。这意味着每次编译后都不会重新创建PDB文件!此文件已修改,这就是其大小更改的原因
这证实了我的猜测。
引述:
改变格式最重要的动机之一是
允许程序调试版本的增量链接,更改
首先在Visual C++版本2中引入.< /P>
另一个问题是,此文件中到底更改了什么?我在书“”中找到的关于文件格式的最详细解释。关键短语是:
当
正在更新现有PDB文件。将数据插入具有
顺序结构通常意味着重组大部分业务
目录PDB文件的随机访问结构借用自该文件
系统允许以最小的工作量添加和删除数据,只需
因为文件可以在文件系统介质上轻松修改。只有
当流增长或收缩时,必须重新排列流目录
跨越页面边界。这一重要属性有助于
PDB文件的增量更新
他描述说,并非文件中的所有数据在每一时刻都有用。在下次编译期间修改该文件之前,某些字节范围仅由零填充
所以,除了一些GUID和年龄编号之外,我无法说出PDB文件中到底发生了什么变化。读了那本书之后,你可以更深一层。祝你好运
更新(2013年3月15日):
我花了更多的时间比较文件。当我以十六进制模式打开它们时,我看到了标题的差异:
文件的页面大小为512字节(200小时+20小时时的值),页面计数不同:
120和124(相应的078h和07Ch)。在我的屏幕上,较小的文件位于左侧。
好啊文件大小的差异正好是2048字节。这意味着编译器在第二次添加4页数据。
然后我发现了所有其他的区别。3/4的文件从一开始就包含小的差异-通常只有几个字节。但在2600h点,我们看到:
看!行/LinkInfo./names./src/files/c:\Windows\microsoft.net\framework\v4.0.30319\helloworld.cs
被裁剪,现在包含不一致的信息
我向前看,在第二个(更大)文件中发现了这一行的完整表示:
此信息现在已放置在可用空间中(请参见左侧的零)。
我猜,一个旧页面(带有损坏的字符串)被标记为未使用的空间
在文件的末尾,我发现了2048字节的新信息——全部为零。从2E00h(十进制为11776)开始,到35F8h(十进制为13816)结束。我们记得,第一个文件的大小正好是11776字节
作为结论:我认为较大的文件不包含任何新的信息。但我仍然无法回答为什么编译器在ProgramDataBase文件的末尾添加了4页空的数据。我认为这些知识是编译器开发人员的秘密。Simon Mourier的评论几乎可以肯定是怎么回事。在第二次运行编译器时,PDB文件会被更新,更新的结果会在PDB中留下“已删除”或未使用的块。在后续构建中,将重用未使用的页面(在过程中创建另一组未使用的页面),而不是为更新分配新页面
如果有一个实用程序来“垃圾收集”虚拟文件系统,那么您可能会再次得到一个12KB的文件。您可能想提及您使用的编译器版本。您抢先告诉我:-)我使用了4.0.30319.1,但我无法重现这种效果。大小始终为12 KB。我使用的是.NET 4.5(4.0.30319.17929)。PDB文件使用未记录的文件格式(“MSF”),表示某种虚拟文件系统,因此物理.PDB文件的大小并不表示其中使用的数据的大小(您可以有未使用的分配页,但仍占用物理空间)。更多信息:装配保持不变。这是正在更改的PDB文件。@REA_ANDREW,PDB直接连接到其关联的程序集,并且每次都会重新编译。例如,原始程序集在每次编译时都会获得一个新的GUID,因此PDB也会获得一个新的GUID以保持两个文件同步。因此,我上面提到的方面也涉及PDB。更多关于这个和其他的细节可以在链接文章中找到。好的,具体来说,程序集的“大小”保持不变,但si