打印
[STM32F1]

堆栈溢出

[复制链接]
1264|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
5574293|  楼主 | 2019-10-31 09:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有没有哪位大神知道在kei中,如何实时查看堆栈的使用情况?

使用特权

评论回复
沙发
ayb_ice| | 2019-10-31 09:58 | 只看该作者
基本没好的办法
只有个粗略办法,先将全部堆栈初始化为某个值,然后看最终改变到了什么地方,只能看最大使用情况

使用特权

评论回复
板凳
dongnanxibei| | 2019-10-31 12:49 | 只看该作者
一般很难出现这种错误吧

使用特权

评论回复
地板
dongnanxibei| | 2019-10-31 12:50 | 只看该作者
如果用C语言做,基本上不会出现这个情况。

使用特权

评论回复
5
5574293|  楼主 | 2019-11-8 10:40 | 只看该作者
ayb_ice 发表于 2019-10-31 09:58
基本没好的办法
只有个粗略办法,先将全部堆栈初始化为某个值,然后看最终改变到了什么地方,只能看最大使 ...

怎么初始化某个值?求教

使用特权

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

你可以通过编译生成的map文件找到堆和栈的起始地址和长度,然后把堆和栈的值全写成某个固定值,比如0xAAAAAAAA,正常运行程序,堆栈的值应该会改变,你就看没有被改变,仍然为0xAAAAAAAA的位置在哪里,就可以计算程序运行时的最大堆栈占用

使用特权

评论回复
7
5574293|  楼主 | 2019-11-8 11:04 | 只看该作者
sonicll 发表于 2019-11-8 10:51
你可以通过编译生成的map文件找到堆和栈的起始地址和长度,然后把堆和栈的值全写成某个固定值,比如0xAAA ...

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

使用特权

评论回复
8
sonicll| | 2019-11-8 14:16 | 只看该作者
本帖最后由 sonicll 于 2019-11-8 14:21 编辑
5574293 发表于 2019-11-8 11:04
恕在下才疏学浅,还是有点懵。主要是我对你们说的,把堆和栈的值全写成固定值,怎么写这一点不是很明白。 ...

堆栈本质还是内存,你直接对内存地址赋值就可以了,比如:
*(uint32_t*)(0x20001000) = 0xAAAAAAAA;
写个for循环,把堆栈全赋值就行了,需要注意你的程序增加了这个赋值操作,原程序的堆栈起始地址可能会改变,需要对照map文件再修改一次

使用特权

评论回复
9
5574293|  楼主 | 2019-11-8 14:32 | 只看该作者
sonicll 发表于 2019-11-8 14:16
堆栈本质还是内存,你直接对内存地址赋值就可以了,比如:
*(uint32_t*)(0x20001000) = 0xAAAAAAAA;
写个f ...

懂你的意思了。感谢赐教

使用特权

评论回复
10
wowu| | 2019-11-19 10:29 | 只看该作者
木有用过keil啊

使用特权

评论回复
11
wakayi| | 2019-11-19 10:34 | 只看该作者
用c语言不用担心这个吧

使用特权

评论回复
12
renzheshengui| | 2019-11-19 10:38 | 只看该作者
用什么语言都需要注意这个 因为c还有指针呢m

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

168

帖子

1

粉丝