c - 在 gdb 中,我的变量显示为 <optimised out>,我怎样才能找到它的值?

标签 c optimization gdb dwarf

在 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/

相关文章:

c - 指向结构的指针在声明时总是设置为 NULL 吗?

c++ - 优化最近邻大小调整算法以提高速度

linux - 最小核心转储(堆栈跟踪+仅限当前帧)

c - 我该如何处理这个段错误

c++ - mac pretty-print gdb

c - Socket : Connect will spend 2 minutes looking for IP before it timesOut. 如何减少该时间?

c++ - 列出 C/C++ 函数(Unix 中的代码分析)

python - 高效的密度函数计算

math - N维叉积的高效计算?

c - char* 和 char[] 与 strcpy() 的区别