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

2019-07-13 03:10发布

在嵌入式开发中,曾遇到程序出现莫名其妙的错误导致程序无法执行,各种折腾之后,终于确定是由栈溢出导致程序挂掉。 例如,有一次,定义了一个函数 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 (需重启):                 #
                * soft stack 102400