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

dan*_*007 35 c++ gdb g++

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

我有这个代码:

int x = floor(sqrt(3));
Run Code Online (Sandbox Code Playgroud)

我想查看x的值.但是,gdb声称x是"<optimized_out>".如何查看x的值?我应该更改编译器标志吗?

bdo*_*lan 38

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

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

  • 您通常也可以反汇编函数并推导出"优化输出"变量实际驻留的寄存器,并打印该变量.正在进行开发工作以使GCC发出足够详细的调试信息,以便GDB将来能够为您做到这一点. (3认同)

Gig*_*igi 15

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

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

void my_function() __attribute__((optimize(0)))
{
  int x = floor(sqrt(3));
}
Run Code Online (Sandbox Code Playgroud)