我在 C 中有以下程序:
1 #include<stdio.h>
2
3 int main(void) {
4 int i=0;
5 for (int k=0; k<10; k++)
6 printf("Number: %d", k);
7 printf("Hello\n");
8 return 0;
9 }
当我在 gdb
中运行它时,它会列出所有寄存器,但我在任何寄存器中都没有看到变量 k
。例如,在下面的屏幕截图中,我知道 k=4
,但我在任何寄存器中都没有看到该值。那么这个数字将存储在哪里?
最佳答案
I know k=4, but I don't see that value in any of the registers. Where would this number be stored then?
如果您优化了程序,该值确实可能会存储在寄存器中(但程序将更难以调试)。
未经优化,该值存储在堆栈上(准确地说,考虑到反汇编,它存储在位置 $rbp-8
处),并由下一条指令加载到寄存器中(您停止的之前)。
如果您执行stepi
并查看$rax
的值,您就会在那里找到它。
附注info locals
将为您提供有关局部变量的信息。
更新:
What does stepi do?
它执行一条机器指令,然后停止。您可以通过阅读手册或使用 help stepi
GDB 命令来找到这一点。
What/were is $rbp-8? Could you please explain a bit more about what that is and how it works?
每一本 x86 编程入门书籍或教程都会介绍这一点。
简单地说,程序执行的当前状态可以描述为一系列链接的激活记录或“帧”。在未经优化的 x86 上,$RBP
寄存器通常用作帧指针寄存器(即它指向当前帧)。局部变量存储在距帧指针负偏移处(此处,k
存储在偏移量 -8 处)。
关于c - C 中局部堆栈变量存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58295967/