我正在使用gdb来调试C ++程序。
我有这段代码:
int x = floor(sqrt(3));
我想查看x的值。但是,gdb声称x是“< optimized_out>”。如何查看x的值?我应该更改编译器标志吗?
答案 0 :(得分:37)
在高优化级别上,编译器可以消除中间值,如您在此处所见。有很多选择:
-O0
肯定会起作用(但速度会慢得多),-O1
也可以正常工作。答案 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变量打印到此全局变量中。确保在完成调试后删除由您创建的这些全局变量!