繁体   English   中英

我如何查看一个值<optimized out> C++ 中的变量?</optimized>

[英]How do I view the value of an <optimized out> variable in C++?

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

我有这段代码:

int x = floor(sqrt(3));

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

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

  • 您可以降低优化级别,以便调试器更轻松地跟踪事物。 -O0肯定可以工作(但会慢很多),- -O1也可能工作正常。
  • 您可以添加一些显式打印语句来记录输出值。
  • 您通常还可以通过将其设置为 volatile 来强制编译器保留此特定值(但请记住在完成后将其取消设置为 volatile!)。 但是请注意,由于优化代码中的控制流也会发生变化,即使您可以看到变量的值,当您查看代码时,可能并不完全清楚您所在的代码点有问题的变量。

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

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

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

使用反向调试时,尽量往后退一步,靠近变量的定义点

如: gdb中<值优化输出>是什么意思? 通常情况下,在函数内:

  • 在函数的开始,可以观察到变量的值
  • 然而,在函数结束时,变量越来越有可能变成<optimized out> ,因为它由于优化而仅存储在寄存器中,而不是存储在堆栈中的内存中。 因此,当不再需要它时,该寄存器很可能会被另一个变量重用和覆盖,然后调试元数据会通知 GDB。

因此,如果您正在使用某种反向调试,例如 Mozilla rr ,一旦您尝试一次,您就会一直这样做,那么一个好的选择是尝试退回到定义点/最后一次使用变量与reverse-finish + reverse-next ,看看你是否可以在那里观察它。

这可以通过在 gdb什么是<值优化输出> 中显示的示例代码来具体观察 并且已经救了我几次,特别是当运行未优化的程序使得到达兴趣点需要很长时间时(考虑到-O0生成的非常低效的程序集,如该答案所示,这并不奇怪)。

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

在带有 VisualGDB 扩展的 Visual Studio 中使用 C++,我看到类范围的变量在语法上是正确的,但是通过运行时变量检查和 hover 文本声称值已被优化,即使它们实际上不是。

为了查看值,在变量名前面加上快速监视中的 class 名称或观看 window 为我解析。

例如:在myclass中似乎被优化掉的myvariable值可以用myclass::myvariable查看。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM