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 のコメントは、ほぼ間違いなく何が起こっているかです。コンパイラの 2 回目の実行で、PDB ファイルが更新され、その更新の結果として、PDB 内に「削除された」または未使用のブロックが残ります。後続のビルドでは、更新用に新しいページを割り当てる代わりに、未使用のページが再利用されます (プロセスで未使用のページの別のセットが作成されます)。

仮想ファイルシステムを「ガベージ コレクション」するユーティリティがあった場合、12KB のファイルが再び作成される可能性があります。

于 2013-03-14T00:15:13.757 に答える
0

コンパイルごとに、新しい異なるアセンブリが作成されます。

正確に何が違うのかを深く掘り下げたい場合は、次の記事をご覧になることをお勧めします:「clr を使ったハッキン​​グ: アセンブリの差分」。

コンパイル間で異なる点:

  • タイムスタンプ
  • ノーオペレーション
  • モジュール定義 GUID
  • デバッグ属性
  • 2 番目のタイムスタンプ
  • PDB-GUID
  • ディレクトリの違い
  • いくつかの 4 バイト オフセット (DataDirectory.Debug、SizeOFData、AddressOfRawData、PointerToRawData、DataDirectory.MetaData)

最初のコンパイルと 2 番目のコンパイルの間の 2kb の追加サイズの違いがどこから来たのかはわかりません。しかし、最初のビルド時には含まれず、その後のコンパイルごとに追加される情報がいくつかあると思います。

于 2013-03-06T15:45:57.193 に答える