12
votes

Intégrer les informations de symbole de débogage .PDB dans un fichier .exe dans Visual Studio

J'expérimente un outil d'analyse capable d'analyser des fichiers exécutables avec des informations de symbole de débogage intégrées dans Windows. Tout en essayant cet outil sur plusieurs projets open source, je me rends compte que la plupart des constructions ne conservent pas d'informations symboliques dans des fichiers exécutables. Je suis capable de compiler le code source avec VS (2008), mais la construction conserve normalement les informations de débogage dans un fichier .PDB séparé, non dans le fichier .exe (malheureusement, je veux seulement lire les informations de débogage du fichier .exe et non fichier .pdb: - ().

Quelqu'un peut-il savoir un moyen d'intégrer les informations de déchets de symboles dans un seul fichier .exe à l'aide de Visual Studio?


0 commentaires

5 Réponses :


2
votes

Il n'y a pas de support intégré dans Visual Studio pour ce type d'opération (au moins pour les langages gérés). Les fichiers .PDB et .exe sont créés en même temps et n'ont aucune option pour l'incorporation. Je ne suis même pas sûr que le format .exe prend en charge les symboles PDB d'intégration, bien que je puisse me tromper sur ce point.

Le seul cours que je peux voir est d'intégrer le PDB comme une ressource dans la version .exe. Cependant, cela devrait être une étape de post-construction puisque les deux sont construites en même temps. Et il y a le potentiel d'invalidation de pièces de la PDB si vous modifiez l'EXE après sa construction.

Y a-t-il une raison particulière que vous essayez de faire cela? J'imagine que ça va finir par vous causer beaucoup de douleur comme 1) Ce n'est pas pris en charge Afaik et 2) la chaîne d'outils est orientée vers la recherche de PDB dans le même répertoire non dans la .EXE. Le déploiement de 2 fichiers est un peu ennuyeux au début, mais c'est comme ça que c'est fait à ce stade.


0 commentaires

0
votes

Je suis à peu près sûr que les PDB étaient toujours des fichiers autonomes. VC ++ utilisait un commutateur qui le causerait d'émettre des informations de symbole (limitée par rapport à la PDB) à un fichier "CoDeview" .DBG .DBG que par défaut a été intégré à l'EXE. Cependant, cet interrupteur ne semble plus être pris en charge dans les versions plus récentes (post-6.x?) Du compilateur.


0 commentaires

5
votes

Je ne sais pas encore, comment faire - mais il y a un article sur MSDN qui en parle.

Un exécutable portable (c.-à-d. .exe code> ou .dll ) Peut avoir un drapeau présent dans l'en-tête A>: ( archive ) em> p>

/SYMBOLS      Setting this option causes DUMPBIN to display the COFF symbol
              table. Symbol tables exist in all object files. A COFF symbol
              table appears in an image file only if it is linked with
              /DEBUG /DEBUGTYPE:COFF
) em> li>
  • Structure chargée_Image ( archive ) em> li>
  • fichiers DBG ( archive ) em> li>
  • Spécification Microsoft PE et Coff ( Archive ) EM> LI>
  • Un aspect en profondeur dans le format de fichier exécutable portable Win32 a > ( archive ) em> li>
  • KB121460 - Format de fichier d'objet commun (COFF) ( archive ) em> li> ul> p>

  • 3 commentaires

    Je ne pense pas que ce soit possible dans le fichier .NET , cependant. Les compilateurs plus anciens C ++ semblaient avoir des moyens de l'intégrer, oui, bien que ces manières, ainsi que les informations de celui-ci, variaient largement sur la base du compilateur et du débogueur ciblé.


    Ian, avez-vous déjà compris cela pour C ++?


    @Mehrdad je n'ai jamais compris du tout!



    6
    votes

    Le MSDN dit que ce n'est pas possible.

    Il n'est pas possible de créer un .exe ou .dll qui contient des informations de débogage. Les informations de débogage sont toujours placées dans un fichier .PDB.


    0 commentaires

    7
    votes

    Je sais que c'est un très vieux problème, mais cette fonctionnalité a récemment été fusionnée à Roslyn: HTTPS: //github.com/dotnet/roslyn/issues/12390


    4 commentaires

    Mais cela ne sera-t-il pas seulement supporté par .NET CORE?


    Je ne le pense pas, qu'est-ce qui te fait dire ça? Cela semble être une fonctionnalité de compilateur général ...


    Parce que seul Coreclr semble être capable de comprendre le PDB intégré? Ou je lime ça faux?


    Hmm, Roslyn (utilisé pour les deux .NET Core et Framework) a maintenant un soutien à cela, mais il est vrai que le débogueur ne le supporte pas encore pour .NET Framework ... je ne sais pas ..