69 votes

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 / éditeur de liens. Dans le cas de GCC, l'option est -g. Lorsque l'option de débogage est activée, comment cela affecte-t-il l'exécutable binaire? Quelles sont les données supplémentaires stockées dans le fichier qui permettent à la fonction de débogage de fonctionner comme elle le fait?

66voto

tgamblin Points 25755

-g indique au compilateur pour stocker la table des symboles d'information dans le fichier exécutable. Entre autres choses, cela comprend:

  • les noms de symboles
  • les informations de type pour les symboles
  • les fichiers et les numéros de ligne où les symboles sont venus de

Débogueurs utiliser cette information à la sortie des noms significatifs pour les symboles et de les associer à des instructions, avec en particulier les lignes de la source.

Pour certains compilateurs, fournissant g de désactiver certaines optimisations. Par exemple, la cpi définit la valeur par défaut niveau d'optimisation à -O0 avec -g, sauf si vous explicitement indiquer-O[123]. Aussi, même si vous ne vous offre -O[123], les optimisations qui empêchent le suivi de pile sera toujours désactivé (par exemple, le décapage cadre des pointeurs de pile d'images. Cela n'a qu'un effet mineur sur la performance).

Avec certains compilateurs, -g va désactiver les optimisations qui peuvent semer la confusion où les symboles venu (instruction de la réorganisation, déroulement de la boucle, l'in-lining, etc). Si vous souhaitez déboguer avec l'optimisation, vous pouvez utiliser -g3 avec gcc pour obtenir autour de cette. Supplémentaire les informations de débogage seront inclus à propos des macros, des expansions, et les fonctions qui peuvent avoir été insérée. Cela peut permettre à des débogueurs et outils de performance de la carte de code optimisé à la source d'origine, mais il est préférable d'effort. Quelques optimisations vraiment marquer le code.

Pour plus d'infos, jetez un oeil à NAIN, le format de débogage à l'origine conçu pour aller de pair avec ELF (le format binaire pour Linux et autres OS).

9voto

Richard Franks Points 1042

Une table de symboles est ajoutée à l'exécutable pour mapper les noms de fonction / variable sur les emplacements de données, afin que les débogueurs puissent renvoyer des informations significatives, plutôt que de simples pointeurs. Cela n’affecte pas la vitesse de votre programme et vous pouvez supprimer la table des symboles avec la commande 'strip'.

8voto

Loki Astari Points 116129

En outre, le débogage et le symbole de l'information
Google NAIN (UN Développeur blague sur ELF)

Par défaut, la plupart des optimisations du compilateur sont désactivés lorsque le débogage est activé.
Donc le code est de la pure traduction de la source en Code Machine, plutôt que le résultat de nombreuses hautement spécialisés transformations appliquées à la libération des fichiers binaires.

Mais la différence la plus importante (à mon avis)
De mémoire dans les versions Debug est généralement initialisé à certains compilateur des valeurs spécifiques pour faciliter le débogage. Dans les versions release de la mémoire n'est pas initialisé sauf s'il est explicitement fait par le code de l'application.

Consultez votre documentation du compilateur pour plus d'informations:
Mais, par exemple, pour DevStudio est:

  • 0xCDCDCDCD Alloué dans le tas, mais pas initialisé
  • 0xDDDDDDDD Publié un segment de mémoire.
  • 0xFDFDFDFD "NoMansLand" clôtures automatiquement placé à la limite de la mémoire du tas. Ne doit jamais être remplacé. Si vous ne vous écraser, vous êtes probablement à la marche, à la fin d'un tableau.
  • 0xCCCCCCCC Alloué sur la pile, mais pas initialisé

7voto

Dima Points 19888

-g ajoute des informations de débogage dans le fichier exécutable, tels que les noms de variables, les noms de fonctions, et des numéros de ligne. Cela permet un débogueur, tel que gdb pour parcourir le code ligne par ligne, de définir des points d'arrêt, 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.

Aussi, gcc permet d'utiliser -g avec -O des drapeaux, qui tournent sur l'optimisation. Débogage d'une optimisation de l'exécutable peut être très difficile, parce que les variables peuvent être optimisées à l'écart, ou des 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.

3voto

Rob Walker Points 25840

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X