在上家公司做 linux 驱动开发主要基于mips架构,在内核下有一个好玩的函数 dump_stack, 只要调用到这个函数就能把函数的调用栈给打印出来,十分方便,不再需要kgdb断点了。
现在做电视机顶盒开发,各种软硬件平台 arm mips linux ecos 都有,有时候想要获得一个函数从哪里调用来的单凭静态分析根本不行,如果动态运行那就要在每个调用前面加入打印,修改量巨大而且容易出错。于是仿照 linux 内核代码 arch/mips/oprofile/backtrace.c 实现了mips架构下的栈回溯功能。
mips栈帧原理
Call stack 是指存放某个程序的正在运行的函数的信息的栈。Call stack 由 stack frames 组成,每个 stack frame 对应于一个未完成运行的函数。
在当今流行的计算机体系架构中,大部分计算机的参数传递,局部变量的分配和释放都是通过操纵程序栈来实现的。栈用来传递函数参数,存储返回值信息,保存寄存器以供恢复调用前处理机状态。 关于栈可见以前的文章: cdecl、stdcall、fastcall函数调用约定区别
每次调用一个函数,都要为该次调用的函数实例分配栈空间。为单个函数分配的那部分栈空间就叫做 stack frame,也就是说,stack frame 这个说法主要是为了描述函数调用关系的。
Stack frame 具体从2点来阐述
第一,它使调用者和被调用者达