Comment imprimer la valeur "optimisée" dans gdb
Question : Je déboguais un programme avec le débogueur
gdb. Lorsque j'ai essayé d'imprimer la valeur d'une variable lors du traçage d'un appel de fonction,gdbindique, sans afficher la valeur. Comment puis-je afficher la valeur d'une variabledansgdb?
Les compilateurs modernes tels que gcc sont capables d'effectuer diverses optimisations basées sur la syntaxe et l'analyse sémantique du code au moment de la compilation. L'objectif de telles optimisations est d'améliorer la vitesse d'exécution du programme et/ou de réduire la taille des binaires, et elles s'accompagnent généralement d'un coût de temps de compilation supplémentaire ou d'une réduction de la capacité de débogage du programme.
Le message dans gdb est un symptôme de telles optimisations du compilateur. Pour afficher la valeur optimisée d'une variable pendant le débogage, vous devez désactiver l'optimisation du compilateur gcc, soit par variable, soit à l'échelle du programme, comme décrit ci-dessous.
(gdb) p quantity
$8 = <optimized out>
Solution 1 : désactiver l'optimisation du compilateur pour chaque variable
Si vous êtes intéressé par une variable particulière dans gdb, vous pouvez déclarer la variable comme "volatile" et recompiler le code. Cela obligera le compilateur à désactiver l'optimisation du compilateur pour cette variable.
volatile int quantity = 0;
Si vous déclarez une variable comme volatile, cela signifie que la variable peut être modifiée de manière externe (par exemple, par le système d'exploitation, un gestionnaire de signal ou une interruption matérielle, etc.). Cela indique essentiellement au compilateur que la valeur de la variable en mémoire peut changer à tout moment. Ainsi, le compilateur ne doit effectuer aucune optimisation sur la variable, ce qui rend la variable également accessible au débogueur gdb.
Solution 2 : désactiver l'optimisation du compilateur pour l'ensemble du programme
Une autre option pour voir toutes les variables dans gdb consiste bien sûr à désactiver complètement l'optimisation gcc.
Recherchez les indicateurs de compilation (par exemple, dans CFLAGS) dans votre Makefile. Vous trouverez quelque chose comme -O1, -O2 ou -O3, qui définit différents niveaux d'optimisation gcc. Supprimez cet indicateur ou remplacez-le par -O0.
Par exemple, changez :
CFLAGS = -g -O2 -DSF_VISIBILITY -fvisibility=hidden -fno-strict-aliasing -Wall
à :
CFLAGS = -g -O0 -DSF_VISIBILITY -fvisibility=hidden -fno-strict-aliasing -Wall
Cela réduira le temps de compilation et permettra à gdb d'inspecter le programme correctement, mais au prix d'une éventuelle réduction des performances d'exécution du programme.