2015-10-22 3 views
1

Hier, j'ai parcouru les projets de notre société et les ai mis à jour pour corriger une erreur (AFAIK) dans la façon dont nous les avons configurés.Générer des fichiers PDB correctement pour une DLL native en utilisant Visual Studio 2013

Le problème est que dans les pages de propriétés pour les projets, sous Configuration Properties -> C/C++ -> Output Files, nous avons mis Program Database File Name-$(OutDir)$(TargetName).pdb, la même valeur nous avions mis Configuration Properties -> Linker -> Debugging -> Generate Program Database File. Ma compréhension est que la première propriété définit l'emplacement du fichier pdb qui contient des symboles pour les fichiers objets créés lors de la compilation de la source, tandis que le second définit l'emplacement du fichier pdb qui contient des symboles pour la DLL générée. Est-ce exact? Pour éviter qu'ils ne soient en conflit (je suppose que c'est indésirable), j'ai mis la première propriété à $(IntDir)$(TargetName).pdb, mais cela a brisé le fichier pdb résultant (ie un débogueur ne le reconnaît pas comme le fichier pdb de la DLL, et un collègue a exécuté un outil dessus, et la signature ne correspond pas à celle contenue dans le binaire).

La chose étrange est que l'utilisation de la valeur $(IntDir)$(TargetName)2.pdb (notez le suffixe '2') résout le problème. Je ne comprends pas pourquoi le nom du fichier intermédiaire aurait de l'importance?

Notez que Configuration Properties -> C/C++ -> General -> Debug Information Format est réglé sur Program Database (/Zi)

+0

Les symboles du module actuel sont contenus dans le fichier: Linker -> Debugging -> Générer le fichier de base de données du programme. (https://msdn.microsoft.com/en-us/library/kwx19e36(v=vs.120).aspx) Ce que vous devez utiliser lors du débogage. – Nandu

+0

Microsoft a fait une erreur il y a très, très longtemps, le genre qu'ils ne peuvent jamais réparer. Ce fichier .pdb n'est pas destiné au débogueur et ne contient pas d'informations de débogage. Le compilateur l'utilise pour garder trace des builds, destinées à accélérer les builds suivants. Changer le réglage n'est pas utile. –

+0

Lequel, l'un sous l'éditeur de liens, ou celui sous C++? Avez-vous un lien vers la documentation pertinente? – Bwmat

Répondre

1

Je dirais que vous avez raison: le compilateur produit des fichiers d'objets. À ce moment-là, la DLL n'est pas encore prête, donc tout ce que contient ce fichier PDB n'est pas utile lors du débogage. Une fois que le lieur a traité la sortie du compilateur, la DLL existe.

À ce moment-là, un PDB est logique pour le débogage. Donc, le fichier pertinent pour le débogage est dans Linker -> Debugging -> Generate Program Database File.

Comme @HansPassant mentionné dans les commentaires, le paramètre Compilateur ne doit pas être touché. Dommage que cela soit déjà arrivé. Dans une application console Visual Studio 2013 ou 2015 C++, la valeur par défaut pour C/C++ -> Output Files est $(IntDir)vc$(PlatformToolsetVersion).pdb, donc le nom final est quelque chose comme Debug\vc120.pdb ou Debug\vc140.pdb. À mon humble avis, la modification du fichier de sortie du compilateur ne devrait pas importer, tant que le nom n'est pas en conflit avec le paramètre de l'éditeur de liens. C'est exactement ce qui vous est arrivé: le nom du compilateur $(IntDir)$(TargetName).pdb (chemin relatif) se résout au même fichier que le nom de l'éditeur de liens $(OutDir)$(TargetName).pdb (chemin absolu). Dans ce cas, il se peut que l'éditeur de liens ne puisse pas écrire dans le fichier, car il est toujours utilisé par le compilateur ou d'autres choses étranges.

+0

Mais ce n'est pas faux de le changer, n'est-ce pas? – Bwmat

+0

@Bwmat: Je ne pense pas que cela devrait avoir de l'importance. Mais en fait, je n'ai jamais essayé ça. Le seul nom que vous ne devriez certainement pas utiliser est '$ (IntDir) $ (TargetName) .pdb', car cela crée une collision de noms avec le fichier de sortie de l'éditeur de liens. –

+0

@Bwmat: ajouté cela à la réponse –