web-dev-qa-db-fra.com

Symboles de débogage de la bibliothèque statique

Dans VS2010, il existe une option pour générer des informations de débogage pour les exes/DLL sous linker mais aucune option de ce type sous bibliothécaire pour les bibliothèques. Les informations de débogage sont-elles intégrées dans la bibliothèque statique?

Il existe une option dans les propriétés C/C++ pour Program Database File Name pour les bibliothèques, les exes et les dll. Par défaut, il va dans mon répertoire intermédiaire et est nommé le nom du projet pour les bibliothèques, mais est nommé vc $ (PlatformToolsetVersion) .pdb pour exes/dlls. Quel est le pdb de cette option et en quoi diffère-t-il du pdb dans l'option de l'éditeur de liens?

Si je fournis une bibliothèque avec des bibliothèques et des en-têtes, comment puis-je fournir des symboles de débogage à un utilisateur de ma bibliothèque?

63
David

Si vous utilisez /ZI Ou /Zi (C/C++ -> General -> Debug Information Format), Alors la fonction vc$(PlatformToolsetVersion).pdb est créé, qui contient les informations de débogage pour tous les fichiers .obj créés. Si vous utilisez alternativement /Z7, Les informations de débogage seront incorporées dans le fichier .obj, Puis incorporées dans .lib. C'est probablement le moyen le plus simple de distribuer les informations de débogage pour un bibliothèque statique.

Cependant, je ne conseillerais pas de distribuer une bibliothèque statique, car elle est généralement liée à une version spécifique du compilateur.

51
mloar

Développant les réponses précédentes, pour ceux qui ont besoin du mode d'emploi complet (VS 2013).

Notez que cela devrait répondre aux commentaires ^^ ci-dessus concernant les problèmes VS2013.

Méthode 1: La façon dont la base de données du programme (.pdb) (/ Zi ou/ZI)

  1. Projet de bibliothèque statique: Générez une pdb avec le même nom que votre bibliothèque statique:

    • Ouvrez Solution Explorer Dans le menu View.
    • Cliquez avec le bouton droit sur votre projet de bibliothèque statique, sélectionnez Properties
    • Modifier Configuration Properties -> C/C++ -> General-> Debug Information En /Zi Ou /ZI
      • Notez que /ZI Permet l'édition "Modifier et continuer" pendant le débogage
    • Modifier Configuration Properties -> C/C++ -> Output Files -> Program Database File Name En $(OutDir)$(TargetName).pdb
    • Maintenant, compilez-le et notez où sont YourLib.lib et YourLib.pdb.
  2. Projet d'application: Liez votre exécutable à la bibliothèque statique et au nouveau fichier PDB :

    • Encore une fois, accédez aux propriétés du projet, mais cette fois, pour votre projet d'application
    • Encore une fois, modifiez la propriété Debug Information Selon vos besoins.
    • Modifiez Configuration Properties -> Linker-> General-> Additional Library Directories, En ajoutant votre propre répertoire "libs", ou tout répertoire que vous prévoyez de conserver/copier votre Fichiers YourLib.lib et YourLib.pdb.
    • Modifier Configuration Properties -> Linker-> Input-> Additional Dependencies, En ajoutant YourLib.lib (Pas de chemin devant)
    • Copiez maintenant YourLib.lib et YourLib.pdb dans le répertoire que vous avez spécifié ci-dessus.

Méthode 2: La méthode des symboles intégrés (pas de .pdb) (/ Z7)

  1. Projet de bibliothèque statique: Générez une bibliothèque statique avec des symboles de débogage intégrés

    • Comme dans la méthode 1, accédez aux propriétés du projet
    • Comme dans la méthode 1, modifiez votre Debug Information, mais cette fois en /Z7
    • Comme dans la méthode 1, compilez et notez où YourLib.lib est généré.
  2. Projet d'application: Liez votre exécutable avec la bibliothèque statique

    • Comme dans la méthode 1, accédez aux propriétés du projet
    • Comme dans la méthode 1, modifiez votre propriété Debug Information Selon vos besoins
    • Comme dans la méthode 1, modifiez Additional Library Directories
    • Comme dans la méthode 1, modifiez Additional Dependencies
    • Copiez maintenant YourLib.lib dans le répertoire spécifié dans Additional Library Directories

Discussion:

  • Avantages de Z7? C'est plus simple, et la façon "Single-file" de le faire. Toutes les informations de débogage se trouvent dans le fichier lib.
  • Inconvénients de Z7? Taille du fichier sur le disque, temps de liaison, incompatible avec la fonction "Reconstruction minimale" (/ Gm), ne le fait pas autorise "Modifier et continuer", ancien format (par exemple, un paradigme plus ancien)
  • Pourquoi je ne spécifie pas le paramètre Debug Information Pour le projet d'application? Ce message concerne la façon de faire déboguer le code lib statique. Le même choix "Méthode 1 vs Méthode 2" s'applique également au projet Application.
34
bunkerdive

Je remarque dans VS2013 qu'il est possible de définir le nom du fichier de base de données du programme dans l'onglet Fichiers de sortie C/C++. Le changer par défaut en quelque chose comme $ (OutDir) $ (TargetName) .pdb résout le problème

17
MilesDavies192

Les bibliothèques statiques sont implémentées dans les programmes qui les utilisent.

Si le programme qui les utilise utilise des symboles de débogage, le code de bibliothèque compilé dans ce programme aura également des symboles.

Informations PDB de wikipedia:

Lorsque les symboles de débogage sont incorporés dans le binaire lui-même, le fichier peut alors devenir considérablement plus volumineux (parfois de plusieurs mégaoctets). Pour éviter cette taille supplémentaire, les compilateurs modernes et les premiers systèmes de débogage de mainframe produisent les informations symboliques dans un fichier séparé; pour les compilateurs Microsoft, ce fichier est appelé fichier PDB.

5
Pubby

Comportement étrange dans VS2012. Construire à partir de zéro (ou avec l'option/A dans nmake) produira un fichier .pdb. Maintenant, supprimez les fichiers .lib et .pdb et réexécutez nmake (sans/A bien sûr, pour exécuter uniquement le lien) et aucun fichier .pdb n'est généré.

1
nothrow