armink / CmBacktrace

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

依靠堆栈中bl/blx指令做回溯依据是否可靠 #33

Open lgl88911 opened 4 years ago

lgl88911 commented 4 years ago

@armink 从代码中看到,堆栈回溯的依据是检查堆栈中的内容是不是bl和blx指令,而不是去计算每个frame大小。如果堆栈中刚好有内容和指令码一样,这样回溯是不是就变得不可靠了?

armink commented 4 years ago

确实会有脏数据的情况,你有更好的处理方法吗?

lgl88911 commented 4 years ago

确实会有脏数据的情况,你有更好的处理方法吗?

glibc的unwind可以做这个事情,但是不适合小型嵌入式系统。 我也是在寻找看有没有比较成熟的方法,由于ARM不使用fp, 所以没法知道stack frame的大小,下面这个链接提供了一个思路,借用gcc编译器来实现,不过要额外消耗内存 https://stackoverflow.com/questions/3398664/how-to-get-a-call-stack-backtrace-deeply-embedded-no-library-support

bear-jiang commented 4 years ago

我在这个链接中看到是可以通过编译选项来使用frame pointer的,不确定是不是所有平台通用。

lgl88911 commented 4 years ago

这个编译选项只对arm架构有效