Подтвердить что ты не робот

Файл PDB больше на втором компиляторе, а затем остается того же размера

Используя следующий простой файл:

using System;

public class Program{
        [STAThread]
        public static void Main(string[] args){
            Console.WriteLine("Boo");
        }
}

И затем используя следующую команду:

csc /target:exe /debug:pdbonly HelloWorld.cs

Если вы запустите эту команду и PDB еще не существует, размер файла PDB составляет 12 КБ. В противном случае, если файл PDB существует, то новый размер файла составляет 14 КБ.

Microsoft (R) Visual C# Compiler version 4.0.30319.17929
.NET 4.5

У кого-нибудь есть идеи, что бы объяснить это?

UPDATE:

4b9b3361

Ответ 1

Мой ответ прост, но, возможно, не так точен. Позвольте использовать один инструмент отладчика в наших файлах PDB:

PDB

Единственное отличие - это поле PdbAge. Это означает, что после каждой компиляции файл PDB не воссоздан! Этот файл изменен, поэтому изменяется его размер.

Мое предположение подтверждается в статье . Цитата:

Одной из важнейших мотивов изменения формата было позволяют инкрементную увязку отладочных версий программ, изменение впервые представленный в Visual С++ версии 2.0.

Другой вопрос: что именно изменилось в этом файле? Наиболее подробное объяснение формата файла, которое я нашел в книге " Свен Б. Шрайбер," Недокументированные секреты Windows 2000: кулинарная книга программистов "". Ключевая фраза:

Еще большее преимущество формата PDB становится очевидным, когда обновление существующего файла PDB. Вставка данных в файл с помощью последовательная структура обычно означает перетасовку больших частей содержание. Структура произвольного доступа к файлу PDB, заимствованная из файла системы позволяют добавлять и удалять данные с минимальными усилиями, просто так как файлы можно легко изменить на медиафайле файловой системы. Только каталог потока должен быть перетасован, когда поток растет или сжимается через границу страницы. Это важное свойство облегчает инкрементное обновление файлов PDB.

Он описывает, что не все данные в файле полезны в каждый момент. Некоторые диапазоны байтов просто заполняются нулями, пока этот файл не будет изменен во время следующей компиляции.

Поэтому я не могу сказать, что именно было изменено в PDB файле, за исключением некоторых идентификаторов GUID и Age. Вы можете пойти глубже после прочтения этой книги. Удачи!

ОБНОВЛЕНИЕ (15/03/2013):

Я потратил еще немного времени на сравнение файлов. Когда я открываю их в режиме HEX, я вижу различия в заголовке: Header Размер файла файла составляет 512 байтов (значение 200h при + 20h), а количество страниц различное: 120 и 124 (078h и 07Ch соответственно). На моих экранах меньший файл находится слева. ОК. Разница в размере файла составляет ровно 2048 байт. Это означает, что компилятор добавляет 4 страницы данных во второй раз. Затем я нашел все другие отличия. 3/4 файла с начала содержит малые diffs - несколько байтов, как обычно. Но в точке 2600h мы видим: Diff

Смотри! Строка /LinkInfo./names./src/files/c:\Windows\microsoft.net\framework\v4.0.30319\helloworld.cs обрезается и теперь содержит непоследовательную информацию.

Я с нетерпением жду и нашел эту строку во втором (большем) файле в полном представлении: Diff2 Теперь эта информация была помещена в свободное пространство (см. Нули слева). Я думаю, старые страницы (с поврежденной строкой) были помечены как неиспользуемое пространство.

И в конце файла я нашел ровно 2048 байт новой информации - все это нули. Начиная с 2E00h (11776 в десятичной форме) и заканчивая на 35F8h (13816 в десятичной системе). И мы помним, что размер первого файла составлял ровно 11776 байт.

Как вывод: я думаю, что более крупный файл не содержит никакой информации new. Но я все еще не могу ответить, почему компилятор добавил 4 пустые страницы данных в конец файла ProgramDataBase. Я думаю, что это знание - секрет разработчиков компилятора.

Ответ 2

Комментарий Симона Моурира почти наверняка происходит. Во втором запуске компилятора файл PDB обновляется, и результат этого обновления оставляет "удаленные" или неиспользуемые блоки внутри PDB. В последующих сборках вместо выделения новых страниц для обновлений неиспользуемые страницы повторно используются (в этом процессе создается другой набор неиспользуемых страниц).

Если бы была утилита "сборщик мусора" в виртуальной файловой системе, скорее всего, вы снова получите файл размером 12 КБ.

Ответ 3

Каждый компилятор создает новую сборку.

Если вы хотите глубоко погрузиться в то, что совсем по-другому, тогда вы можете взглянуть на эту статью: " взломать clr: различные сборки".

Величины, которые различаются между компиляциями:

  • Отметка
  • нет-OPS
  • GUID ModuleDef
  • Атрибут отладки
  • Вторая временная метка
  • PDB-GUID
  • Разница в каталоге
  • Несколько 4 байтовых смещений (DataDirectory.Debug, SizeOFData, AddressOfRawData, PointerToRawData, DataDirectory.MetaData)

Я не знаю, откуда взялась дополнительная разница в размере 2kb между первой и второй компиляцией. Но я предполагаю, что может быть некоторая информация, которая не включена в первый раз, но добавляется при каждом последующем компиляции.