OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子全套STM32开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...
查看: 666|回复: 7

请问堆栈溢出问题

[复制链接]

  离线 

4

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2013-5-21
在线时间
6 小时
发表于 2018-1-10 10:39:15 | 显示全部楼层 |阅读模式
1金钱
请问各位大侠如果出现堆栈溢出、数组下标越界问题,  如何排查,定位出错的原因及解决办法? 谢谢!

最佳答案

查看完整内容[请看2#楼]

这里的两个参数管理堆栈的大小:
回复

使用道具 举报

  离线 

12

主题

69

帖子

0

精华

高级会员

Rank: 4

积分
915
金钱
915
注册时间
2013-8-22
在线时间
66 小时
发表于 2018-1-10 10:39:16 | 显示全部楼层
这里的两个参数管理堆栈的大小:
QQ图片20180110201426.png
我不理财,财就不理我。
回复

使用道具 举报

  离线 

6

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2016-8-13
在线时间
26 小时
发表于 2018-1-11 08:42:40 | 显示全部楼层
数组下标越界后,MDK会报错啊。但是堆栈溢出后,完全不会报错。具体我也纳闷,被堆栈溢出坑过很多次。
回复

使用道具 举报

  离线 

22

主题

87

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2016-10-12
在线时间
33 小时
发表于 2018-1-11 11:21:53 | 显示全部楼层
这是没办法完全提前预知的,一般情况下,使用FATFS或是操作系统,设大一点。
keil默认是0x400; 用FATFS时,用0x800
如果又用了操作系统,0xa00
有一点,如果你使用了printf函数,再加0x200
回复

使用道具 举报

  离线 

72

主题

2719

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3445
金钱
3445
注册时间
2014-8-4
在线时间
676 小时
发表于 2018-1-11 11:58:18 | 显示全部楼层
预防为主吧,涉及到的时候保守些、谨慎些
回复

使用道具 举报

  离线 

4

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2013-5-21
在线时间
6 小时
 楼主| 发表于 2018-1-12 09:23:32 | 显示全部楼层
如果只是堆栈问题,  可以将堆栈大小增大。  如果是下标越界,就不太好查了,   有没有好的方法能够进行定位, 什么地方堆栈溢出, 什么数组下标越界了。
举例如下:

BYTE abyBuff[10];
int i = 0;
int nLen = 1000;   //nLen 是个不确定的值,  这里只是举例,  虽然现在可以用 nLen  跟 sizeof(abyBuff) 进行比较,  但以前写的程序有很多地方没做类似的检测判断,     出问题后,  请问有哪些方法进行问题定位???

for (i = 0;  i < nLen; i++)
{
     abyBuff[i] = 0x11;
}
回复

使用道具 举报

  离线 

2

主题

93

帖子

0

精华

高级会员

Rank: 4

积分
860
金钱
860
注册时间
2017-12-11
在线时间
170 小时
发表于 2018-1-12 12:03:37 | 显示全部楼层
锋利的菜刀切猪肉很快,当然切手指头也会很快。
C的性能和灵活,和(相对)不可控性本来就是一对矛盾体。
网上传有人建议C取消指针,请问,不拿金箍棒的悟空还算是悟空嘛?
如果楼主能总结一套相对简单(例如说通过编译手段就能察觉的内存泄漏或者溢出),并且保证C不损失原有的性能和灵活性。那楼主绝对是大师级别的任务。

楼主说堆栈溢出,增大堆栈即可。这句话也不严谨。
首先,堆是堆,栈是栈,不可混为一谈。
其次,增大多少为合适,多了浪费,少了不够,如何权衡?
之前看frreRTOS的时候,它使用一种检查栈溢出的方式是高水位计法,这个还比较容易理解。楼主可以百度看看。

我觉得更多是看经验,但这是一句废话了......
回复

使用道具 举报

  离线 

4

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2013-5-21
在线时间
6 小时
 楼主| 发表于 2018-1-15 10:47:25 | 显示全部楼层
bootblack 发表于 2018-1-12 12:03
锋利的菜刀切猪肉很快,当然切手指头也会很快。
C的性能和灵活,和(相对)不可控性本来就是一对矛盾体。
...

不好意思,    本人对于说“增大堆栈即可”本来只是想表达解决问题的一种思路, 说的的确是不够严谨。 因为程序中很少有用到内存动态分配问题,  所以没把堆栈加以区分, 实在是不够专业。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则




关闭

报名原子哥新品发布会&粉丝见面会上一条 /1 下一条

正点原子公众号

QQ|联系我们|手机版|官方淘宝店|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-10-23 20:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表
/* */