我正在使用gdb来调试一个C++程序。
我有以下代码:
int x = floor(sqrt(3));
我想查看x的值。但是,gdb显示x为"< optimized_out >"。我该如何查看x的值?我需要更改编译器标志吗?
-O0
肯定能工作(但速度会慢),-O1
也可能工作得不错。gcc
可以优化您的代码,使其成为这种方式 - 这是无法查看变量的另一个可能原因。请参阅此答案以了解如何查看寄存器变量:https://dev59.com/LHM_5IYBdhLWcg3wgzhl#1354762 - appas-O0
选项,对我来说几乎每个变量都被“优化掉”了。编译选项为 -g -fcoroutines -fno-inline -O0 -pthread -std=gnu++2a
。 - Jarrod Smith如果您不能或不想禁用优化,则可以尝试将变量声明为 volatile 。这通常足以使编译器在最终代码中保留变量。
另外,在最近的GCC版本中,您可以像这样仅为函数禁用优化:
void my_function() __attribute__((optimize(0)))
{
int x = floor(sqrt(3));
}
optnone
时,无论如何变量都被优化掉了(clang 3.8)。 - starturtle<optimized out>
。由于优化,它只存储在寄存器中,而不是内存堆栈上。因此,当不再需要它时,寄存器很可能被重用并被另一个变量覆盖,然后调试元数据会告知GDB。因此,如果您使用某种反向调试,例如Mozilla的rr
,那么一种好的方法是使用reverse-finish
+reverse-next
尝试向变量的定义/上次使用的位置回溯,并查看是否能够在那里观察到它。
这可以用What does <value optimized out> mean in gdb?中显示的示例代码具体观察,并且已经多次帮助我解决问题,特别是在运行未优化程序需要太长时间才能到达感兴趣的点时(这并不奇怪,因为-O0
生成的汇编代码效率极低)。
使用Visual Studio和VisualGDB扩展的C++中,我看到了语法正确但在运行时变量检查和悬停文本中声称值已被优化的类作用域变量,尽管它们实际上并没有被优化。
为了查看该值,在快速监视或监视窗口中在变量名前缀加上类名即可解决问题。
例如:在myclass
中似乎已经被优化掉的myvariable
值可以通过myclass::myvariable
来查看。
-O0
标志来实现这一点。 - Cody Gray