ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU
打印

[STM32F1] 堆栈溢出

[复制链接]
211|8
跳转到指定楼层
楼主
 楼主 | 2019-10-31 09:40 | 只看该作者 |退出气泡模式 回帖奖励 |倒序浏览 |阅读模式
沙发
| 2019-10-31 09:58 | 只看该作者
基本没好的办法
只有个粗略办法,先将全部堆栈初始化为某个值,然后看最终改变到了什么地方,只能看最大使用情况
板凳
| 2019-10-31 12:49 | 只看该作者
一般很难出现这种错误吧
地板
| 2019-10-31 12:50 | 只看该作者
如果用C语言做,基本上不会出现这个情况。
5
 楼主 | 2019-11-8 10:40 | 只看该作者
ayb_ice 发表于 2019-10-31 09:58
基本没好的办法
只有个粗略办法,先将全部堆栈初始化为某个值,然后看最终改变到了什么地方,只能看最大使 ...

怎么初始化某个值?求教
6
| 2019-11-8 10:51 | 只看该作者
5574293 发表于 2019-11-8 10:40
怎么初始化某个值?求教

你可以通过编译生成的map文件找到堆和栈的起始地址和长度,然后把堆和栈的值全写成某个固定值,比如0xAAAAAAAA,正常运行程序,堆栈的值应该会改变,你就看没有被改变,仍然为0xAAAAAAAA的位置在哪里,就可以计算程序运行时的最大堆栈占用
7
 楼主 | 2019-11-8 11:04 | 只看该作者
sonicll 发表于 2019-11-8 10:51
你可以通过编译生成的map文件找到堆和栈的起始地址和长度,然后把堆和栈的值全写成某个固定值,比如0xAAA ...

恕在下才疏学浅,还是有点懵。主要是我对你们说的,把堆和栈的值全写成固定值,怎么写这一点不是很明白。我看过程序编译过后的map文件,堆和栈的空间都是2Kb,也尝试过调试的时候一步一步去看我SP指针有没有超过我栈的范围。但是效果甚微。
主要是之前的程序有出现这样的情况,在某一个时刻,我一个结构体变量里面其中一个的值,发生了赋值,很明显是被溢出的东西给改变了。
8
| 2019-11-8 14:16 | 只看该作者
本帖最后由 sonicll 于 2019-11-8 14:21 编辑
5574293 发表于 2019-11-8 11:04
恕在下才疏学浅,还是有点懵。主要是我对你们说的,把堆和栈的值全写成固定值,怎么写这一点不是很明白。 ...

堆栈本质还是内存,你直接对内存地址赋值就可以了,比如:
*(uint32_t*)(0x20001000) = 0xAAAAAAAA;
写个for循环,把堆栈全赋值就行了,需要注意你的程序增加了这个赋值操作,原程序的堆栈起始地址可能会改变,需要对照map文件再修改一次
9
 楼主 | 2019-11-8 14:32 | 只看该作者
sonicll 发表于 2019-11-8 14:16
堆栈本质还是内存,你直接对内存地址赋值就可以了,比如:
*(uint32_t*)(0x20001000) = 0xAAAAAAAA;
写个f ...

懂你的意思了。感谢赐教
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表
重庆彩票网 福建11选5开奖 快3平台 快乐时时彩 80彩票 爱乐透彩票 华阳彩票 山东群英会规则 重庆彩票 22彩票