[英]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 。 这通常足以让您的编译器在最终代码中保留变量。
或者,在最近的 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.