Last updated on August 29, 2020 by Dan Nanni
gdb
debugger. When I tried to print the value of a variable while tracing a function call, gdb
says <value optimized out>
, not displaying the value. How can I show the value of an <optimized out>
variable in gdb
?Modern compilers such as gcc
are able to perform various optimizations based on syntax and semantic analysis of the code at compile time. The goal of such optimizations is to improve program execution speed and/or reduce binary size, and they typically come with the cost of extra compilation time or reduced debuggability of the program.
The <value optimized out>
message in gdb
is one symptom of such compiler optimizations. To view the optimized-out value of a variable during debugging, you need to turn off gcc
compiler optimization, either on a per-variable basis, or program-wide, as described below.
(gdb) p quantity $8 = <optimized out>
If you are interested in a particular variable in gdb
, you can declare the variable as "volatile" and recompile the code. This will make the compiler turn off compiler optimization for that variable.
volatile int quantity = 0;
If you declare a variable as volatile, it means that the variable can be modified externally (e.g., by the operating system, a signal handler, or hardware interrupt, etc). This essentially tells the compiler that the variable's value in memory can change at any time. Thus the compiler must not perform any optimization on the variable, which makes the variable accessible to gdb
debugger as well.
Another option to see all <optimized out>
variables in gdb
is of course disabling gcc
optimization altogether.
Look for compilation flags (e.g., in CFLAGS
) in your Makefile. You will find something like -O1
, -O2
or -O3
, which defines various levels of gcc
optimization. Remove this flag, or change it to -O0
.
For example, change:
CFLAGS = -g -O2 -DSF_VISIBILITY -fvisibility=hidden -fno-strict-aliasing -Wall
to:
CFLAGS = -g -O0 -DSF_VISIBILITY -fvisibility=hidden -fno-strict-aliasing -Wall
This will reduce compilation time, and allows gdb
to inspect the program properly, but at the cost of possibly reduced run-time program performance.
This website is made possible by minimal ads and your gracious donation via PayPal or credit card
Please note that this article is published by Xmodulo.com under a Creative Commons Attribution-ShareAlike 3.0 Unported License. If you would like to use the whole or any part of this article, you need to cite this web page at Xmodulo.com as the original source.
Xmodulo © 2021 ‒ About ‒ Write for Us ‒ Feed ‒ Powered by DigitalOcean