Comment L'Option de débogage-g modifie-t-elle l'exécutable binaire?

lors de l'écriture de code C/C++, pour déboguer l'exécutable binaire, l'option de débogage doit être activée sur le compilateur/linker. Dans le cas de GCC, l'option est-g. Lorsque l'option de débogage est activée, quel effet cela a-t-il sur l'exécutable binaire? Quelles données supplémentaires sont stockées dans le fichier qui permet la fonction de débogage comme il le fait?

58
demandé sur Jon Ball 2008-09-18 06:55:41

7 réponses

- g dit au compilateur de stocker des informations de table de symboles dans l'exécutable.

  • les noms de symboles
  • "151930920 de type" info pour les symboles
  • les fichiers et les numéros de ligne où les symboles de

les débogueurs utilisent cette information pour produire des noms significatifs pour les symboles et pour associer des instructions avec des lignes particulières dans la source.

pour certains compilateurs, la fourniture-g va désactiver certaines optimisations. Par exemple, icc définit le niveau d'optimisation par défaut à-O0 avec-g à moins que vous n'indiquiez explicitement-O[123]. En outre, même si vous faites supply-O[123], les optimisations qui empêchent le traçage de la pile seront tout de même désactivées (par exemple, enlever les pointeurs de cadre des cadres de pile). Cela n'a qu'un effet mineur sur la performance).

avec certains compilateurs, - g va désactiver les optimisations qui peuvent confondre les symboles provenait de (réordinage d'instruction, déroulement de boucle, inclinaison etc). Si vous souhaitez déboguer avec l'optimisation, vous pouvez utiliser -g3 avec gcc pour obtenir autour de cette. Des informations de débogage supplémentaires seront incluses sur les macros, les extensions et les fonctions qui peuvent avoir été insérées. Cela permet aux débogueurs et aux outils de performance de faire correspondre le code optimisé à la source d'origine, mais c'est le meilleur effort. Certaines optimisations altèrent vraiment le code.

pour plus d'information, jetez un oeil à nain , le format de débogage initialement conçu pour aller de pair avec ELF (le format binaire Pour Linux et D'autres OS).

55
répondu tgamblin 2009-02-10 16:32:13

en plus des informations de débogage et de symbole

Google DWARF (une blague de développeur sur ELF)

par défaut, la plupart des optimisations des compilateurs sont désactivées lorsque le débogage est activé.

Le code est donc la traduction pure de la source en code Machine plutôt que le résultat de nombreuses transformations hautement spécialisées qui sont appliquées aux binaires de publication.

Mais la différence la plus importante (à mon avis)

La mémoire dans les constructions de débogage est généralement initialisée à certaines valeurs spécifiques du compilateur pour faciliter le débogage. Dans la version construit la mémoire n'est pas initialisée sauf si explicitement fait par le code d'application.

consultez la documentation de votre compilateur pour plus d'informations:

Mais un exemple pour DevStudio est:

  • 0xcdcdcdccd alloué en tas, mais non initialisé
  • 0xDDDDDDDD a libéré la mémoire de tas.
  • 0xfdfdfdfd" NoMansLand " clôtures placées automatiquement à la limite de la mémoire tas. Ne devrait jamais être réécrit. Si vous en réécrivez un, vous êtes probablement en train de quitter le bout d'une rangée.
  • 0xcccccccc alloué sur la pile ,mais non initialisé""
8
répondu Martin York 2008-09-18 03:12:16

une table de symboles est ajoutée à l'exécutable qui relie les fonctions/noms de variables aux emplacements de données, de sorte que les débogueurs puissent rapporter des informations significatives, plutôt que de simples pointeurs. Cela n'affecte pas la vitesse de votre programme, et vous pouvez supprimer la table de symboles avec la commande 'strip'.

7
répondu Alexandra Franks 2008-09-18 03:07:28

- G ajoute des informations de débogage dans l'exécutable, telles que les noms des variables, les noms des fonctions et les numéros de ligne. Cela permet à un débogueur, tel que gdb, de passer d'une ligne de code à l'autre, de définir les points de rupture et d'inspecter les valeurs des variables. En raison de cette information supplémentaire à l'aide de g augmente la taille de l'exécutable.

en outre, gcc permet d'utiliser-g avec-O drapeaux, qui tournent sur l'optimisation. Débogage d'un exécutable optimisé être très délicat, parce que les variables peuvent être optimisés loin, ou les instructions peuvent être exécutées dans un ordre différent. Généralement, c'est une bonne idée de désactiver l'optimisation lors de l'utilisation d'-g, même si les résultats en beaucoup plus lent code.

6
répondu Dima 2008-09-18 03:10:55

il y a un certain chevauchement avec cette question qui couvre la question de l'autre côté.

3
répondu Rob Walker 2017-05-23 10:31:09

tout comme une question d'intérêt, vous pouvez ouvrir un hexeditor et jeter un oeil à un exécutable produit avec -g et un sans. Vous pouvez voir les symboles et les choses qui sont ajoutés. Cela peut changer l'assemblage ( -S ) aussi, mais je ne suis pas sûr.

3
répondu Bernard 2008-09-18 03:14:01

certains systèmes d'exploitation (comme z/OS ) produisent un "fichier latéral" qui contient les symboles de débogage. Cela permet d'éviter les ballonnements l'exécutable avec des informations supplémentaires.

3
répondu Anthony Giorgio 2008-09-18 03:23:21