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

新手上路,请多包涵

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

我有这个代码:

 int x = floor(sqrt(3));

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

原文由 dangerChihuahua007 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.4k
2 个回答

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

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

原文由 bdonlan 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

如图: gdb中是什么意思? 通常情况下,在函数内:

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

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

这可以通过示例代码中的示例代码具体观察到, <值优化输出>在 gdb 中的含义是什么? 并且救了我几次,尤其是在运行未优化的程序时,它需要很长时间才能到达感兴趣的点(这并不奇怪,因为 -O0 生成的程序集效率极低,如该答案所示)。

原文由 Ciro Santilli OurBigBook.com 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题