28

使用以下简单文件:

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

任何人都有任何想法可以解释这一点?

更新:

  1. 我在 .NET 3.5 和评论 .NET 4 中也没有遇到过这种情况。
  2. 使用 pdb2xml ( http://blogs.msdn.com/b/jmstall/archive/2005/08/25/sample-pdb2xml.aspx ),我看不出大小之间有任何区别。
4

3 回答 3

18
于 2013-03-13T23:59:35.053 回答
2

Simon Mourier 的评论几乎可以肯定正在发生的事情。在编译器的第二次运行时,PDB 文件得到更新,并且更新的结果在 PDB 中留下了“已删除”或未使用的块。在后续构建中,不再为更新分配新页面,而是重用未使用的页面(在此过程中创建另一组未使用的页面)。

如果有一个“垃圾收集”虚拟文件系统的实用程序,您可能会再次得到一个 12KB 的文件。

于 2013-03-14T00:15:13.757 回答
0

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

如果您想深入了解到底有什么不同,那么您可能想看看这篇文章:“使用 clr 进行黑客攻击:差异程序集”。

编译之间的不同之处:

  • 时间戳
  • 无操作
  • 模块定义 GUID
  • 调试属性
  • 第二个时间戳
  • PDB-GUID
  • 目录差异
  • 几个 4 字节偏移量(DataDirectory.Debug、SizeOFData、AddressOfRawData、PointerToRawData、DataDirectory.MetaData)

我不确定第一次和第二次编译之间额外的 2kb 大小差异来自哪里。但我可能有一些信息在第一次构建时没有包含,但在每次后续编译时都会添加。

于 2013-03-06T15:45:57.193 回答