armink / CmBacktrace

Advanced fault backtrace library for ARM Cortex-M series MCU | ARM Cortex-M 系列 MCU 错误追踪库
MIT License
1.59k stars 640 forks source link

如何进行栈帧回溯的? #21

Open zhangshengping opened 5 years ago

zhangshengping commented 5 years ago

在编译器不保存FP(frame pointer)的情况下,如何在程序内进行栈帧回溯的?

leiddev commented 5 years ago

跟函数返回的过程是一样的,模拟函数返回的过程就可以进行栈帧回溯

zhangshengping commented 5 years ago

函数返回的时候是会调整SP(sub sp, #n)的,然后再通过bx lr,进行返回的,但是编写程序的时候是不知道每个函数的栈大小的. 这怎么模拟函数返回啊?

leiddev commented 5 years ago

那函数返回时是根据什么来调整SP的呢?寄存器里面应该是有这个信息的吧

zhangshengping commented 5 years ago

编译的时候确定的, 如 进入时执行了push lr, sub sp #20 , 对应的退出的时候会执行 add sp #20, pop pc.