【问题标题】:Is <value optimized out> in gdb a problem?gdb 中的 <value optimization out> 有问题吗?
【发布时间】:2011-01-17 10:37:51
【问题描述】:

我有一个只在 -O2 优化中崩溃的应用程序(使用 gcc 4.2.4 编译)。当我单步执行代码并到达崩溃点并尝试检查值时,我会在 gdb 中得到一个“优化的值”。

我在互联网上读到这意味着该值存储在寄存器中。我想知道我的崩溃是否与某些信息被放置在寄存器中的事实有关?有没有办法打印寄存器中的内容以查看它是否已损坏?有没有办法保持优化但不使用寄存器?

谢谢!

【问题讨论】:

  • 优化通常不会产生错误(这种情况极为罕见)。但是,它通常会导致暴露在未优化版本中未被检测到的内存泄漏。
  • 请接受答案;你问这个问题已经快 2 年了。

标签: c++ gcc gdb


【解决方案1】:

要注意的一件事是指针别名,编译器可以在其中做出您不遵守的假设,例如,您传递给函数的指针不指向该函数也使用的全局变量。 但是你可以通过编译器选项等来控制它。

【讨论】:

    【解决方案2】:

    这不是问题,更多的是在新版本的 gcc 中进行积极优化。

    请参阅:A Plan to Fix Local Variable Debug Information in GCC

    【讨论】:

    • 你怎么能这么肯定?我们还没有看到他的代码;当然这可能是 gcc 优化中的一个错误,但在我们获得更多信息之前......
    【解决方案3】:

    如果您可以检测到程序流程中的错误,您可以自己进行一些打印,如果它与内存泄漏和内存损坏有关,那么 valgrind 可能是比 gdb 更好的朋友。

    【讨论】:

      【解决方案4】:

      99% 的可能是代码中的错误,1% 的可能是编译器代码生成错误。因此,请花一定的时间寻找代码中的潜在错误,但请注意,您只是可能发现了代码生成错误(在这种情况下,您需要仔细研究编译器生成的代码以看看是什么问题)。

      【讨论】:

      • 更像是 99.9% 和 0.1%。优化器具有惊人的能力,即使在正常运行的情况下也能破解有细微错误的代码。
      • @Caspin - 是的,你可能是对的 - 即使 1000 中的 1 个错误是由编译器引起的,也可能夸大了它。我想在过去的 25 年里我只见过少数真正的编译器错误(至少在成熟、稳定的编译器中)。
      【解决方案5】:

      在 gdb 中尝试info registers

      您可以使用 -O0 禁用优化,但有一些问题,我建议您进一步调查并最终发布代码。

      【讨论】:

        猜你喜欢
        • 2015-07-26
        • 2010-11-23
        • 2011-07-26
        • 1970-01-01
        • 1970-01-01
        • 2017-05-26
        • 2023-03-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多