OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4924|回复: 7

请问堆栈溢出问题

[复制链接]

4

主题

10

帖子

0

精华

初级会员

Rank: 2

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

最佳答案

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

这里的两个参数管理堆栈的大小:
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

93

帖子

0

精华

金牌会员

Rank: 6Rank: 6

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

使用道具 举报

6

主题

37

帖子

0

精华

初级会员

Rank: 2

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

使用道具 举报

35

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

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

使用道具 举报

4

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2013-5-21
在线时间
8 小时
 楼主| 发表于 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;
}
回复

使用道具 举报

33

主题

215

帖子

0

精华

金牌会员

Rank: 6Rank: 6

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

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

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

使用道具 举报

4

主题

10

帖子

0

精华

初级会员

Rank: 2

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

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

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-18 17:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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