如何在C ++中查看<optimized out =“”>变量的值?</optimized>

时间:2012-02-03 04:26:00

标签: c++ gdb g++

我正在使用gdb来调试C ++程序。

我有这段代码:

int x = floor(sqrt(3));

我想查看x的值。但是,gdb声称x是“&lt; optimized_out&gt;”。如何查看x的值?我应该更改编译器标志吗?

4 个答案:

答案 0 :(得分:37)

在高优化级别上,编译器可以消除中间值,如您在此处所见。有很多选择:

  • 您可以降低优化级别,以便调试程序更容易跟踪事物。 -O0肯定会起作用(但速度会慢得多),-O1也可以正常工作。
  • 您可以添加一些显式的print语句来记录输出值。
  • 您通常也可以强制编译器通过使其变得易变而保留此特定值(但请记住在您完成后取消使其变得不稳定!)。但是请注意,由于控制流程也会受到优化代码的更改,即使您可以看到变量的值,也可能不完全清楚您在代码中的哪一点。重新审视有问题的变量。

答案 1 :(得分:14)

如果您不能或不想禁用优化,则可以尝试将变量声明为 volatile 。 这通常足以使您的编译器在最终代码中保留变量。

或者,在最近的GCC版本中,您可以仅为一个函数禁用优化,如下所示:

void my_function() __attribute__((optimize(0)))
{
  int x = floor(sqrt(3));
}

答案 2 :(得分:1)

使用反向调试时,请尝试向后退一步,使其更靠近变量的定义点

What does <value optimized out> mean in gdb?所示,通常情况是在函数内可以先观察变量的值,后来由于不再需要它和包含它的寄存器而变成<optimized out>被覆盖。

因此,如果您使用某种reverse debugging such as Mozilla rr,一次尝试就将一直使用它,那么一个好的选择是尝试退回到更接近定义/最后使用的位置reverse-finish + reverse-next来查看变量是否存在。

这可以通过What does <value optimized out> mean in gdb?所示的示例代码来具体观察到,并为我节省了很多时间,尤其是在运行未优化的程序时,花很长时间才能到达关注点(鉴于-O0产生的效率极低,如该答案所示。

答案 3 :(得分:0)

创建自己的“全局变量”并将优化的out变量打印到此全局变量中。确保在完成调试后删除由您创建的这些全局变量!

相关问题