Question

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?

Était-ce utile?

La solution

-g indique au compilateur de stocker les informations de la table des symboles dans l'exécutable. Cela inclut entre autres:

  • noms de symboles
  • informations de type pour les symboles
  • fichiers et numéros de ligne d'où proviennent les symboles

Les débogueurs utilisent ces informations pour générer des noms significatifs pour les symboles et pour associer des instructions à des lignes particulières de la source.

Pour certains compilateurs, fournir -g désactivera certaines optimisations. Par exemple, icc définit le niveau d'optimisation par défaut sur -O0 avec -g sauf si vous indiquez explicitement -O [123]. De même, même si vous fournissez -O [123], les optimisations qui empêchent le traçage de la pile seront toujours désactivées (par exemple, en supprimant les pointeurs de trame des trames de la pile. Cela n'a qu'un effet mineur sur les performances).

Avec certains compilateurs, -g désactivera les optimisations pouvant confondre l’origine des symboles (réorganisation des instructions, déroulement de la boucle, alignement, etc.). Si vous voulez déboguer avec l'optimisation, vous pouvez utiliser -g3 avec gcc pour contourner cela. Des informations de débogage supplémentaires seront incluses concernant les macros, les extensions et les fonctions éventuellement insérées. Cela peut permettre aux débogueurs et aux outils de performance de mapper le code optimisé sur la source d'origine, mais ce sera au mieux. Certaines optimisations réduisent vraiment le code.

Pour plus d'informations, consultez DWARF , le format de débogage conçu à l'origine avec ELF (le format binaire pour Linux et les autres systèmes d’exploitation).

Autres conseils

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

En plus des informations de débogage et des symboles
Google DWARF (blague pour développeurs sur ELF)

Par défaut, la plupart des optimisations du compilateur sont désactivées lorsque le débogage est activé.
Le code est donc la traduction pure du code source en code machine plutôt que le résultat de nombreuses transformations hautement spécialisées appliquées aux versions binaires.

Mais la différence la plus importante (à mon avis)
La mémoire dans les versions de débogage est généralement initialisée avec certaines valeurs spécifiques du compilateur afin de faciliter le débogage. Dans les versions release, la mémoire n’est initialisée que si le code de l’application le fait explicitement.

Consultez la documentation de votre compilateur pour plus d'informations:
Mais voici un exemple pour DevStudio:

  
      
  • 0xCDCDCDCD alloué dans le tas, mais non initialisé
  •   
  • 0xDDDDDDDDD Mémoire de segment libérée.
  •   
  • 0xFDFDFDFD " NoMansLand " clôtures automatiquement placées à la limite de la mémoire de tas. Ne devrait jamais être écrasé. Si vous en écrasez un, vous êtes probablement en train de terminer la fin d’un tableau.
  •   
  • 0xCCCCCCCC alloué sur la pile mais non initialisé
  •   

-g ajoute des informations de débogage dans l'exécutable, telles que les noms de variables, les noms de fonctions et les numéros de ligne. Cela permet à un débogueur, tel que gdb, de parcourir le code ligne par ligne, de définir des points d'arrêt et d'inspecter les valeurs des variables. En raison de ces informations supplémentaires, l'utilisation de -g augmente la taille de l'exécutable.

De plus, gcc permet d’utiliser -g avec les options -O, qui activent l’optimisation. Déboguer un exécutable optimisé peut être très délicat, car les variables peuvent être optimisées, ou les instructions peuvent être exécutées dans un ordre différent. En règle générale, il est judicieux de désactiver l'optimisation lorsque vous utilisez -g, même si le code est beaucoup plus lent.

Il y a un certain chevauchement avec ce question qui traite de la question de l’autre côté.

À titre d’intérêt, vous pouvez ouvrir un éditeur de texte et jeter un coup d’œil sur un exécutable produit avec -g et un autre sans. Vous pouvez voir les symboles et les choses qui sont ajoutées. Cela pourrait changer l’assemblage ( -S ) aussi, mais je ne suis pas sûr.

Certains systèmes d'exploitation (tels que z / OS ) produisent un "fichier annexe". ; qui contient les symboles de débogage. Cela évite de gonfler l'exécutable avec des informations supplémentaires.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top