Ответ 1
Мой ответ прост, но, возможно, не так точен. Позвольте использовать один инструмент отладчика в наших файлах PDB:
Единственное отличие - это поле PdbAge
. Это означает, что после каждой компиляции файл PDB не воссоздан! Этот файл изменен, поэтому изменяется его размер.
Мое предположение подтверждается в статье . Цитата:
Одной из важнейших мотивов изменения формата было позволяют инкрементную увязку отладочных версий программ, изменение впервые представленный в Visual С++ версии 2.0.
Другой вопрос: что именно изменилось в этом файле? Наиболее подробное объяснение формата файла, которое я нашел в книге " Свен Б. Шрайбер," Недокументированные секреты Windows 2000: кулинарная книга программистов "". Ключевая фраза:
Еще большее преимущество формата PDB становится очевидным, когда обновление существующего файла PDB. Вставка данных в файл с помощью последовательная структура обычно означает перетасовку больших частей содержание. Структура произвольного доступа к файлу PDB, заимствованная из файла системы позволяют добавлять и удалять данные с минимальными усилиями, просто так как файлы можно легко изменить на медиафайле файловой системы. Только каталог потока должен быть перетасован, когда поток растет или сжимается через границу страницы. Это важное свойство облегчает инкрементное обновление файлов PDB.
Он описывает, что не все данные в файле полезны в каждый момент. Некоторые диапазоны байтов просто заполняются нулями, пока этот файл не будет изменен во время следующей компиляции.
Поэтому я не могу сказать, что именно было изменено в PDB файле, за исключением некоторых идентификаторов GUID и Age. Вы можете пойти глубже после прочтения этой книги. Удачи!
ОБНОВЛЕНИЕ (15/03/2013):
Я потратил еще немного времени на сравнение файлов. Когда я открываю их в режиме HEX, я вижу различия в заголовке:
Размер файла файла составляет 512 байтов (значение 200h при + 20h), а количество страниц различное:
120 и 124 (078h и 07Ch соответственно). На моих экранах меньший файл находится слева.
ОК. Разница в размере файла составляет ровно 2048 байт. Это означает, что компилятор добавляет 4 страницы данных во второй раз.
Затем я нашел все другие отличия. 3/4 файла с начала содержит малые diffs - несколько байтов, как обычно. Но в точке 2600h мы видим:
Смотри! Строка /LinkInfo./names./src/files/c:\Windows\microsoft.net\framework\v4.0.30319\helloworld.cs
обрезается и теперь содержит непоследовательную информацию.
Я с нетерпением жду и нашел эту строку во втором (большем) файле в полном представлении:
Теперь эта информация была помещена в свободное пространство (см. Нули слева).
Я думаю, старые страницы (с поврежденной строкой) были помечены как неиспользуемое пространство.
И в конце файла я нашел ровно 2048 байт новой информации - все это нули. Начиная с 2E00h (11776 в десятичной форме) и заканчивая на 35F8h (13816 в десятичной системе). И мы помним, что размер первого файла составлял ровно 11776 байт.
Как вывод: я думаю, что более крупный файл не содержит никакой информации new. Но я все еще не могу ответить, почему компилятор добавил 4 пустые страницы данных в конец файла ProgramDataBase. Я думаю, что это знание - секрет разработчиков компилятора.