栈帧
栈帧的概念:
每个线程都有自己的栈空间,对应线程的每一个执行的函数,都有一个相对应的栈帧,栈帧存有该函数的入参、出参、局部变量以及返回地址,一个完整的栈信息就是由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