我在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
,但是在任何寄存器中都没有看到该值。那么该号码将存储在哪里?
答案 0 :(得分:0)
我知道k = 4,但是在任何寄存器中都没有看到那个值。那么该号码将存储在哪里?
如果优化了程序,则该值确实可能存储在寄存器中(但程序将很难调试)。
未经优化,该值将存储在堆栈中(准确地说,是在进行反汇编的情况下,它存储在位置$rbp-8
中),并由下一条指令(一个 之前)。
如果您执行stepi
并查看$rax
的值,则可以在其中找到它。
P.S。 info locals
将为您提供有关局部变量的信息。
更新:
stepi做什么?
它执行一条机器指令,然后停止。您可以通过阅读手册或使用help stepi
GDB命令来找到答案。
$ rbp-8是什么?您能再解释一下这是什么以及它如何工作吗?
每本x86入门编程书籍或教程都将涉及到这一点。
简而言之,程序执行的当前状态可以描述为一系列链接的激活记录或“框架”。在未经优化的x86上,$RBP
寄存器通常用作帧指针寄存器(即,它指向当前帧)。本地变量与帧指针的偏移量为负(此处k
的偏移量为-8)。