在 gdb 中,如何发现显示为优化的变量的值?
据推测,该值存储在寄存器中,我如何找出哪个?
鉴于这个简单的程序(从下面命名的网站复制)。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int foo = rand();
printf("foo is %d\n", foo++);
return foo;
}
编译优化。
gcc -O3 -g optimized.c
gdb a.out
运行 GDB
(gdb) print foo
$1 = <optimized out>
到底是怎么回事?变量
foo
必须存在于某个地方,但我如何找到它的值(value)或它的存储位置?我找到了一个页面,其中详细解释了 DWARF 调试信息如何适用于优化代码 https://undo.io/resources/gdb-watchpoint/build-for-debug-in-gdb .使用那里的建议,我最终可以找到分配给
foo
的寄存器。但它相当痛苦。我怎样才能让 gdb 告诉我要观看哪个寄存器?
我尝试使用 -g3 进行编译,但这没有帮助。
我在 gdb 中尝试了一些命令也没有帮助。
ptype foo
info locals
print &foo
最佳答案
The variable foo must exist somewhere
没有要求它应该存在。 C++ 在 as-if 上运行原则。该程序就像变量存在一样工作。如果编译器能够在遵守 as-if 原则的同时将变量抛出窗口,那么它会热切期待这样做。这就是优化的本质。如果您不喜欢它,请不要使用优化。为了获得额外的双重强保护,声明感兴趣的变量
volatile
.how do I find its value or where it is stored
它不必存储在任何地方。在这种情况下,您可以通过查看程序的输出和/或检查其退出状态来找到它的值。没有通用的方法来确定分配了优化的变量的哪个寄存器。可能有也可能没有这样的寄存器,这取决于您的程序的确切细节。值和导致它的计算很可能与存储一起被优化掉。 (不是在这种情况下,因为该值是从外部可见的)。
关于c - 在 gdb 中,我的变量显示为 <optimised out>,我怎样才能找到它的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59071606/