Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# PDB文件在第二次编译时变大,然后保持相同大小_C#_.net_Csc - Fatal编程技术网

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
有人知道怎么解释吗

更新:

  • 我在.NET3.5和.NET4的评论中也没有这样的经历
  • 使用pdb2xml(),我看不出小的和大的有什么区别

  • 每次编译都会创建一个新的不同程序集

    如果您想深入了解到底什么是不同的,那么您可能想看看这篇文章:“

    不同汇编之间的差异:

    • 时间戳
    • 没有行动
    • 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