Ma réponse est simple, mais peut-être pas si précise. Utilisons un outil de débogage sur nos fichiers PDB :
La seule différence est le champ PdbAge
. Cela signifie que le fichier PDB n'est pas recréé après chaque compilation ! Ce fichier est modifié, c'est pourquoi sa taille change.
Ma supposition est confirmée dans cet article. Citation:
Une des motivations les plus importantes pour le changement de format était de permettre le lien incrémental des versions de débogage des programmes, un changement introduit pour la première fois dans Visual C++ version 2.0.
Une autre question est ce qui est exactement modifié dans ce fichier ? L'explication la plus détaillée du format de fichier que j'ai trouvée est dans le livre "Sven B. Schreiber, “Undocumented Windows 2000 Secrets: A Programmer’s Cookbook”". La phrase clé est :
Un avantage encore plus grand du format PDB devient apparent lors de la mise à jour d'un fichier PDB existant. Insérer des données dans un fichier avec une structure séquentielle signifie généralement réorganiser de larges portions du contenu. La structure d'accès aléatoire du fichier PDB empruntée aux systèmes de fichiers permet l'ajout et la suppression de données avec un effort minimal, tout comme les fichiers peuvent être modifiés aisément sur un support de système de fichiers. Seul le répertoire de flux doit être réorganisé lorsqu'un flux s'étend ou se rétrécit à travers une limite de page. Cette propriété importante facilite la mise à jour incrémentielle des fichiers PDB.
Il décrit que toutes les données dans le fichier ne sont pas utiles à chaque instant. Certains plages d'octets sont simplement remplis de zéros jusqu'à ce que le fichier soit modifié lors de la prochaine compilation.
Je ne peux donc pas dire ce qui a été exactement modifié dans le fichier PDB, sauf quelques GUID et numéros de version. Vous pouvez approfondir la lecture de ce livre. Bonne chance !
MISE À JOUR (15/03/2013):
J'ai passé un peu plus de temps à comparer les fichiers. Quand je les ouvre en mode HEX, je vois les différences dans l'en-tête : La taille de la page du fichier est de 512 octets (valeur 200h à +20h) et le nombre de pages est différent : 120 et 124 (078h et 07Ch respectivement). Sur mes écrans, le fichier le plus petit est à gauche. D'accord. La différence de taille de fichier est exactement de 2048 octets. Cela signifie que le compilateur ajoute 4 pages de données lors de la seconde fois. Ensuite, j'ai trouvé toutes les autres différences. Les 3/4 du fichier depuis le début contiennent de petites différences - quelques octets comme d'habitude. Mais au point 2600h, nous voyons :
Regardez! La ligne /LinkInfo./names./src/files/c:\Windows\microsoft.net\framework\v4.0.30319\helloworld.cs
est maintenant tronquée et contient des informations incohérentes.
J'ai continué et j'ai trouvé cette ligne dans le second fichier (plus grand) en représentation complète : Ces informations ont été placées dans un espace libre maintenant (voir les zéros du côté gauche). Je suppose que les anciennes pages (avec la chaîne corrompue) ont été marquées comme espace inutilisé.
Et à la fin du fichier, j'ai trouvé exactement 2048 octets d'informations nouvelles - tous sont des zéros. À partir de 2E00h (11776 en décimal) et se terminant à 35F8h (13816 en décimal). Et nous nous souvenons, la taille du premier fichier était exactement de 11776 octets.
En conclusion: je pense que le fichier plus grand ne contient aucune information neuve. Mais je ne peux toujours pas répondre pourquoi le compilateur a ajouté 4 pages de données vides à la fin du fichier ProgramDataBase. Je pense que cette connaissance est un secret des développeurs du compilateur.