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

原创 2015年07月09日 17:53:50

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

例如,有一次,定义了一个函数 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





版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

嵌入式操作系统内核原理和开发(任务创建和堆栈溢出检查)

虽然写操作系统的博客要比写普通的技术点要麻烦一些,但是心中还是挺开心的。一方面,通过几行代码就可以说明一些问题,把理论实践化,这本身就很具有挑战性;另外一方面还锻炼自己的沟通能力,让更多的人明白你的想...

造成堆栈溢出异常的XML

  • 2011-07-08 10:59
  • 236KB
  • 下载

嵌入式操作系统内核原理和开发(任务创建和堆栈溢出检查)

【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】    虽然写操作系统的博客要比写普通的技术点要麻烦一些,但是心中还是挺开心的。一方面,通过几行...

C程序编写的堆栈溢出

  • 2011-05-28 22:14
  • 60KB
  • 下载

qt4嵌入式开发环境搭建过程(包括各种异常问题)(1)

整理一下我的qt嵌入式开发环境搭建过程及遇到的问题

qt4嵌入式开发环境搭建过程(包括各种异常问题)(2)

上一章介绍了宿主机上的qt4环境搭建 这章介绍
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)