2010-02-11 9 views
7

Je me demandais si je pouvais obtenir une liste d'options de gcc pouvant causer un comportement étrange de gdb.Option GCC qui peut causer des problèmes lors du débogage avec GDB

Bien sûr, nous savons tous que l'utilisation d'options d'optimisation (-O3 par exemple) provoque un comportement étrange dans gdb, mais quelles sont les autres options qui peuvent avoir un tel impact?

(Je suis actuellement en essayant d'exécuter un décodeur MPEG-2 dans gdb et j'obtenir un comportement bizarre, même après le retrait des drapeaux d'optimisation ...)

+0

Décrivez bizarre. Avez-vous ajouté -ggdb? Et le plus important: écrivez les options que vous utilisez toujours. – ebo

+0

Seulement utilisé -g et -g3 déjà. Le comportement bizarre dans mon cas est quelque chose comme ceci: une définition de fonction commence à la ligne 654, 'n' puis saute à la ligne 765, un autre 'n' revient à la ligne 654 et ainsi de suite pour 4 ou 5 fois, bien sûr, ligne 765 n'est pas celui qui devrait être le prochain ... Mais même si je cherche le drapeau qui cause ce problème en ce moment, je suis curieux des différentes options qui peuvent causer un comportement étrange plus généralement. – claf

+0

Pour l'option que j'utilise toujours, il y a beaucoup de calme, je ne les ai pas posés dans ma question et je l'ai plutôt rendu plus général. – claf

Répondre

9

Je pense qu'il est difficile de dire ce que les drapeaux que vous utilisez lorsque vous appelez should't gcc pour le débogage. Le gcc docs note que les indicateurs de débogage par défaut sont -g et -O2, et en utilisant -g -O0 -fno-inline désactive toute optimisation et fonction inlining. À mon avis, si vous voulez vraiment garantir que rien ne gâchera votre processus de débogage, il vous suffit de compiler avec les drapeaux -g -O0 -fno-inline.

+0

que se passe-t-il si vous avez en même temps le drapeau -O3, un autre drapeau, et "-g -O0 -fno-inline"? – user65636

+0

J'ai fait un programme simple et j'utilise -O3 -g -O0 -fno-inline -S et j'ai eu la même sortie de -g -O0 -fno-inline -S. Mais avec -g -O0 -fno-inline -O3 -S la sortie était différente, dans ce cas, le code d'assemblage avec -O3 était plus grand que le code généré sans -O3. Je ne connais pas encore les implications de ce résultat. – coelhudo

+2

Aucune surprise, le -O0 écrase le -O3 dans le premier cas. La page de manuel gcc dit: "Si vous utilisez plusieurs options -O, avec ou sans numéro de niveau, la dernière option de ce type est celle qui est efficace." – bug313

0

Comme indiqué dans GCC documentation, vous devez utiliser -og:

-og

expérience Optimize de débogage. -Og active les optimisations qui n'interfèrent pas avec le débogage. Ce devrait être le niveau d'optimisation du cycle d'édition-compilation-débogage standard, offrant un niveau d'optimisation raisonnable tout en maintenant une compilation rapide et une bonne expérience de débogage.

Il décrit également chaque indicateur d'optmisation et son impact sur le débogage.

+1

En principe oui, en pratique «-O0» pourrait être préférable –