在Ubuntu的gdb中,<优化掉>是什么意思?

8

在Ubuntu中使用gdb进行调试时,我在断点后尝试打印一些内容。它显示为<value optimized out >。在make文件中,我已将-O2更改为-O0,但是仍然出现相同的错误。如何消除此错误并打印优化过的值?


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

8
可怕的“optimized out”信息意味着编译器决定无法告诉调试器变量所在的位置。它可能完全消失了,或者它可能只是以某种方式过于复杂(也许是出于在编译器代码中保持清晰度的兴趣)而无法表示。
有一些技术可以用来避免这个消息。
首先,请确保启用了 -fvar-tracking。如果您使用 DWARF (旁注:永远不要使用 stabs),则如果进行优化,则它应该是默认设置,但最好再次确认。您可能还需要 - fvar-tracking-assignments。这些标志告诉 GCC 更努力地为变量生成调试信息。
如果失败,并且您仍然需要特定的变量,则可以尝试以更少的优化进行编译。-O0 应该有效。我在帖子中看到您说它不起作用,但根据我长期在 gdb 上工作的经验,这总是某种开发人员错误——您忘记重新构建正确的文件,使用了错误的库等。您还可以尝试 -Og,它尝试仅启用不会影响调试的优化。
最后一个选择是尝试使相关变量在您感兴趣的点处存在。例如,您可以取其地址并将其传递给其他函数,注意不要让编译器优化掉该函数。

3
我的钱投注在开发人员的错误上。使用-O0重新构建正确的二进制文件将会修复它。 - Employed Russian
1
@Tom:谢谢你的回答。我忘记重新构建它了,现在已经修复了。 - user4915609

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接