[其他ST产品] (GCC)STM32进阶详解之栈回溯

[复制链接]
 楼主| 大鹏2365 发表于 2023-1-15 23:22 | 显示全部楼层
最关键的函数留在了最后:
8631463c3e554d0f19.png
 楼主| 大鹏2365 发表于 2023-1-15 23:24 | 显示全部楼层
我们最后打印的就是:
2122463c41a9c7c22e.png
 楼主| 大鹏2365 发表于 2023-1-15 23:26 | 显示全部楼层
所以关键在函数cm_backtrace_call_stack中:
6194963c41b07b2b3d.png
 楼主| 大鹏2365 发表于 2023-1-15 23:27 | 显示全部楼层
在没有堆栈溢出的情况下,buffer里面会先保存两个值,一个是执行错误代码时的PC,在这个demo中是0x08001da6,然后又保存了执行错误代码时的LR-1,在这里是:0x08001dfd-1=0x08001dfc。
 楼主| 大鹏2365 发表于 2023-1-15 23:28 | 显示全部楼层
 楼主| 大鹏2365 发表于 2023-1-15 23:29 | 显示全部楼层
最后就是循环检测栈区,然后把符合的保存下来。  
 楼主| 大鹏2365 发表于 2023-1-15 23:30 | 显示全部楼层
GCC下使用该库

其实和MDK差不多,但是看过我置顶的那篇讲内存的文章会知道,CubeMX生成的工程中,栈空间大小并非是我们分配的大小。详细参考:

所以我们最后看下GCC下该库需要如何使用。这里只是简单讲一下,因为原理已经讲清楚了,具体的修改可自行解决。
 楼主| 大鹏2365 发表于 2023-1-15 23:31 | 显示全部楼层
主要在初始化时,获取栈起始地址和栈大小,以及代码段起始地址和代码段大小:
 楼主| 大鹏2365 发表于 2023-1-15 23:31 | 显示全部楼层
 楼主| 大鹏2365 发表于 2023-1-15 23:32 | 显示全部楼层
它们的定义如下:
4403663c41c89d5835.png
 楼主| 大鹏2365 发表于 2023-1-15 23:33 | 显示全部楼层
但是我们随便使用CubeMX创建一个STM32F103ZET6的GCC工程,打开.ld文件会发现
 楼主| 大鹏2365 发表于 2023-1-15 23:34 | 显示全部楼层
找不到_sstack和_stext,只能找到结尾:
3224163c41ccd4dfd7.png
 楼主| 大鹏2365 发表于 2023-1-15 23:35 | 显示全部楼层
 楼主| 大鹏2365 发表于 2023-1-15 23:40 | 显示全部楼层
 楼主| 大鹏2365 发表于 2023-1-15 23:41 | 显示全部楼层
我们可以这样修改:
9738163c41e921cd3d.png
 楼主| 大鹏2365 发表于 2023-1-15 23:45 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部