嵌入式开发中堆栈溢出导致程序异常退出

在嵌入式开发中,曾遇到程序出现莫名其妙的错误导致程序无法执行,各种折腾之后,终于确定是由栈溢出导致程序挂掉。

例如,有一次,定义了一个函数 my_Func1,(struct A param1, struct B param2),在主进程中调用该函数,一切OK,但是在子线程中调用该函数时,程序却出现了段错误。

   还有一次,定义了函数my_Func2(struct A param1, struct B param2),程序在执行到该函数时总是会出现莫名其妙的错误导致无法继续执行,屏蔽该函数//my_Func2(...),之后,程序正常执行,但是使用如下方式屏蔽该函数时,程序仍旧无法执行

my_Func2(......)

{

return 0;

...........

}


之所以会出现上面的错误,是因为在调用函数时,会将函数的参数入栈,导致栈溢出,引起程序出错。


当未显式指定程序的栈空间时,系统会使用默认的栈空间大小,该大小可通过ulimit -a查看(也可用ulimit-s直接查看):


查到的是子线程的栈空间,主线程的栈空间远大于该数值,所以栈溢出一半出现在子线程中。所以在主线程中调用时没有问题,而在子线程中就可能出现段错误!


要解决该问题,可使用如下方法

1、创建线程时在线程属性中指定栈大小
2、使用ulimit -s size将线程栈空间临时修改为size大小。或ulimit -s size写入启动脚本中
3、修改/etc/security/limits.conf文件,如下可将线程栈空间设置为10MB (需重启):
                #<domain> <type> <item> <value>

                * soft stack 102400





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值