GCC -g vs -g3 GDB Flag: Quelle est la différence?

102

Lors de la compilation du code source C avec gcc ou Clang, j'utilise toujours l' -gindicateur pour générer des informations de débogage pour gdb.

gcc -g -o helloworld helloworld.c

J'ai remarqué que certaines personnes recommandent à la -g3place. Quelle est la différence entre les indicateurs -get -g3? Y a-t-il également une différence entre -get -ggdb?

Haziz
la source
15
Je suis venu ici parce que j'utilise le makefile de quelqu'un d'autre, et la documentation est une bête pour commencer. Bonne question à avoir sur StackOverflow pour trouver une réponse simple de google.
GreenAsJade
Un nombre écrasant de questions sur le SO sont «couvertes par la documentation» tant que vous êtes prêt à creuser suffisamment loin. Ce n'est pas une raison valable pour rejeter une question.
BeeOnRope

Réponses:

104

À partir de la documentation :

-g

Produisez des informations de débogage au format natif du système d'exploitation (stabs, COFF, XCOFF ou DWARF 2). GDB peut travailler avec ces informations de débogage. Sur la plupart des systèmes qui utilisent le format stabs, -g permet d'utiliser des informations de débogage supplémentaires que seul GDB peut utiliser; ces informations supplémentaires améliorent le fonctionnement du débogage dans GDB mais font probablement planter d'autres débogueurs ou refusent de lire le programme. Si vous voulez contrôler avec certitude si vous souhaitez générer les informations supplémentaires, utilisez -gstabs +, -gstabs, -gxcoff +, -gxcoff ou -gvms (voir ci-dessous).

...


-ggdb

Produire des informations de débogage à utiliser par GDB. Cela signifie utiliser le format le plus expressif disponible (DWARF 2, stabs ou le format natif si aucun de ceux-ci n'est pris en charge), y compris les extensions GDB si possible.


-gvmslevel

Demandez des informations de débogage et utilisez également le niveau pour spécifier la quantité d'informations. Le niveau par défaut est 2. Le niveau 0 ne produit aucune information de débogage. Ainsi, -g0 annule -g.

....

Le niveau 3 comprend des informations supplémentaires, telles que toutes les définitions de macros présentes dans le programme. Certains débogueurs prennent en charge l'expansion des macros lorsque vous utilisez -g3.

MByD
la source
8
Est-il possible d'expliquer encore quelle est la différence entre par exemple "format le plus expressif" et "informations supplémentaires"? Ces paramètres sont-ils complémentaires? Beaucoup d'entre eux mentionnent GDB ... Merci!
rogerdpack
28

tl; dr: Pour répondre à votre question spécifique, -g3"inclut des informations supplémentaires telles que les définitions de macros ... Certains débogueurs prennent en charge l'expansion des macros lorsque vous utilisez -g3", alors qu'il -gn'inclut pas ces informations supplémentaires.

La réponse plus large est que gcc prend en charge quatre niveaux d'informations de débogage, de -g0(informations de débogage désactivées) à -g3(informations de débogage maximales).

Spécifier -géquivaut à -g2. Curieusement, la documentation gcc en dit peu sur les informations -g/ -g2inclut ou exclut:

Demandez des informations de débogage et utilisez également le niveau pour spécifier la quantité d'informations. Le niveau par défaut est 2. Le niveau 0 ne produit aucune information de débogage. Ainsi, -g0 annule -g.

Le niveau 1 produit des informations minimales, suffisantes pour faire des backtraces dans des parties du programme que vous ne prévoyez pas de déboguer. Cela inclut des descriptions de fonctions et de variables externes, ainsi que des tables de numéros de ligne, mais aucune information sur les variables locales.

Le niveau 3 comprend des informations supplémentaires, telles que toutes les définitions de macros présentes dans le programme. Certains débogueurs prennent en charge l'expansion des macros lorsque vous utilisez -g3.

U007D
la source