栈帧

栈帧的概念:

每个线程都有自己的栈空间,对应线程的每一个执行的函数,都有一个相对应的栈帧,栈帧存有该函数的入参、出参、局部变量以及返回地址,一个完整的栈信息就是由N个栈帧组成的,栈空间的开辟是由高地址向低地址的。

 

 

写一个简单的函数调用

#include <cstdio>
#include <string.h>

void func2(int& a)
{
     a+= 2;
}

int func1()
{
     int a = 4;
     func2(a);
     return a;
}

int main()
{
     func1();
}

 

反汇编可执行文件,可以看出每一个函数执行的时候都有一个压栈的操作(push   %rbp) ,这样就在当前栈帧保存了上一帧的返回地址,当当前帧退出,就能回到上一帧了。

objdump -d a.out > a.asm

 

 

通过gdb调试查看堆栈

 

 

查看栈帧信息

 

 

可以看出第0帧的栈底指针是0x7fffffffe350, 第1帧的栈底指针是0x7fffffffe370,第2帧的栈底指针是0x7fffffffe380

 

posted @ 2022-06-11 12:27  ho966  阅读(77)  评论(0编辑  收藏  举报