【问题标题】:<Optimized out > in gdb in ubuntu<优化> 在 ubuntu 的 gdb 中
【发布时间】:2015-08-15 23:49:12
【问题描述】:

在 ubuntu 中使用 gdb 进行调试时,在断点之后我尝试打印一些东西。它显示了价值优化>。在 make 文件中,我已将 O2 更改为 O0,即使这样也会发生相同的错误。如何摆脱这个错误并打印优化后的值?

【问题讨论】:

  • 你能展示一些周围的代码吗?
  • @buttiful butterfly : 是的,我正在使用 -g 进行编译(顺便说一下,我使用的是 makefile)
  • @legoscia: 周围的代码是什么?
  • 值设置点周围的代码,以及您尝试打印它的位置。
  • 我想知道这是否有帮助。此外,该部分包含许多新结构,因此可能有点难以理解

标签: c++ ubuntu gdb


【解决方案1】:

可怕的“优化”消息意味着编译器决定它不能告诉调试器变量所在的位置。它可能完全消失了,或者它可能太复杂而无法以某种方式表示(也许是为了编译器代码内部的理智)。

您可以使用一些技巧来避免此消息。

首先,确保-fvar-tracking 已启用。如果您使用 DWARF,它应该是优化时的默认设置(旁注:永远不要使用 stabs),但确保它并没有什么坏处。你可能也想要-fvar-tracking-assignments。这些标志告诉 GCC 更加努力地为变量生成调试信息。

如果失败了,而您仍然需要一个特定的变量,您可以尝试使用较少的优化进行编译。 -O0 应该可以工作。我在帖子中看到您说它不起作用,但是根据我在 gdb 上工作的长期经验,这总是被证明是某种开发人员错误——您忘记重建正确的文件,您使用了错误的库,类似的东西。你也可以试试-Og,它会尝试只启用不会影响调试的优化。

最后一个选择是尝试使有问题的变量在您感兴趣的位置生效。例如,您可以获取它的地址并将其传递给其他函数,注意不要让编译器优化该函数。

【讨论】:

  • 我的钱花在开发者错误上。用-O0 重建right 二进制文件 修复它。
  • @Tom:谢谢你的回答。我忘了重建它现在已经修复了
猜你喜欢
  • 2015-01-16
  • 2017-07-20
  • 2017-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
相关资源
最近更新 更多