打印
[STM32F1]

实时查看堆栈的使用情况?

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

使用特权

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

使用特权

评论回复
板凳
wyjie| | 2021-10-13 23:42 | 只看该作者
一般很难出现这种错误吧

使用特权

评论回复
地板
chenjunt| | 2021-10-13 23:43 | 只看该作者
如果用C语言做,基本上不会出现这个情况。

使用特权

评论回复
5
huangchui|  楼主 | 2021-10-13 23:46 | 只看该作者
怎么初始化某个值?求教

使用特权

评论回复
6
renyaq| | 2021-10-13 23:47 | 只看该作者
你可以通过编译生成的map文件找到堆和栈的起始地址和长度,然后把堆和栈的值全写成某个固定值

使用特权

评论回复
7
zhaoxqi| | 2021-10-13 23:50 | 只看该作者
比如0xAAAAAAAA,正常运行程序,堆栈的值应该会改变,你就看没有被改变

使用特权

评论回复
8
shimx| | 2021-10-13 23:52 | 只看该作者
仍然为0xAAAAAAAA的位置在哪里,就可以计算程序运行时的最大堆栈占用

使用特权

评论回复
9
huangchui|  楼主 | 2021-10-13 23:54 | 只看该作者
恕在下才疏学浅,还是有点懵。主要是我对你们说的,把堆和栈的值全写成固定值,怎么写这一点不是很明白。

使用特权

评论回复
10
huangchui|  楼主 | 2021-10-13 23:56 | 只看该作者
我看过程序编译过后的map文件,堆和栈的空间都是2Kb,也尝试过调试的时候一步一步去看我SP指针有没有超过我栈的范围。

使用特权

评论回复
11
wyjie| | 2021-10-13 23:58 | 只看该作者
效果咋样

使用特权

评论回复
12
zchong| | 2021-10-14 08:01 | 只看该作者
huangchui 发表于 2021-10-13 23:54
恕在下才疏学浅,还是有点懵。主要是我对你们说的,把堆和栈的值全写成固定值,怎么写这一点不是很明白。 ...

map文件可以看到堆栈地址,主函数运行的时候给这段内存赋值。注意堆和栈的增长方向,并且要在开头预留一段不要填充数据。

使用特权

评论回复
13
jlyuan| | 2021-10-17 21:30 | 只看该作者
效果甚微

使用特权

评论回复
14
huangchui|  楼主 | 2021-10-17 21:39 | 只看该作者
嗯,主要是之前的程序有出现这样的情况,在某一个时刻,我一个结构体变量里面其中一个的值,发生了赋值,很明显是被溢出的东西给改变了。

使用特权

评论回复
15
xxrs| | 2021-10-17 21:42 | 只看该作者
堆栈本质还是内存,你直接对内存地址赋值就可以了,

使用特权

评论回复
16
jiajs| | 2021-10-17 21:47 | 只看该作者
比如:
*(uint32_t*)(0x20001000) = 0xAAAAAAAA;
写个for循环,把堆栈全赋值就行了,需要注意你的程序增加了这个赋值操作,原程序的堆栈起始地址可能会改变,需要对照map文件再修改一次

使用特权

评论回复
17
huangchui|  楼主 | 2021-10-17 21:49 | 只看该作者
懂你的意思了。感谢赐教

使用特权

评论回复
18
renyaq| | 2021-10-17 21:51 | 只看该作者
木有用过keil啊

使用特权

评论回复
19
huangchui|  楼主 | 2021-10-17 21:53 | 只看该作者
用c语言不用担心这个吧

使用特权

评论回复
20
dingy| | 2021-10-17 21:56 | 只看该作者
用什么语言都需要注意这个 因为c还有指针呢m

使用特权

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

本版积分规则

918

主题

12323

帖子

4

粉丝