栈回溯原理:
利用寄存器内容以及sp指向的栈数据信息和pc指向的程序指令信息。
Thumb指令和arm指令两种情形。
Thumb指令:
-
- 获取sp和pc(lr)值
- 根据call入口压栈特征,通过pc(如果pc无效,改用lr)回溯代码,找到push或者stmdb sp! ..指令,根据指令特征判断栈帧尺寸;
- 根据上一步获得的指令位置前溯代码,查找sub sp指令(栈临时变量)修正栈帧尺寸;
- 根据栈帧尺寸更新sp和pc值
- 根据pc(lr)值判断是否到达栈底,如果到达栈底,则结束回溯,否则进入1重新读取下一个栈帧。
代码实现参考:
AliOS-Things/backtrace.c at master · alibaba/AliOS-Things (github.com)
Arm指令:
略