使用CMAKE过程中碰到的栈溢出问题总结

本文总结了在Linux环境下使用CMake时遇到的栈溢出问题。问题表现为,一个大型系统中,多线程运行时,某个函数内的大数组导致segmentation fault。即使增加栈大小仍无法解决问题,但将数组改为堆分配则问题解决。文章探讨了线程栈和进程栈的区别,以及ulimit -s命令对线程栈大小的影响,同时提出了CMake可能影响线程栈大小的猜测。
摘要由CSDN通过智能技术生成

最近在Linux开发中使用CMKE自动生成makefile,程序运行中碰到了栈溢出的问题(实际还不太确定是不是stack overflow problem导致),于是花了很多时间细细研究了内存划分及分配等相关机制,感觉了解比以前透彻了不少,在此做一下先总结一下问题及解决方法以及还存在的疑问。

碰到的问题

先说一下碰到的问题:我们在Linux下写的程序,是一个庞大的系统,一个进程下启用了超过30个线程同时运行,某个线程中一个函数体内声明了一个大概8KB大小的数组。在原先自己写的Makefile编译运行都正常,但是采用Cmake的方式自动生成makefile,编译通过,运行的时候每次都会出现segmentation fault,backtrace显示被调用函数的入参都为0,但是上一级函数传入参数的时候,所有参数都是有值的。一进入被调用函数,就出现了core dump,gdb backtrace显示程序挂在了被调用函数的第一行。

解决办法

碰到该问题,现象有些诡异,函数调用前的入参都是有值的,一进入函数,就都变成了0。经过长时间的debug,最后确定是函数内申请的8KB数组导致的segfault。因此推断是数组导致栈溢出,覆盖了入参的值(不确定是否最终原因)。但是Linux系统默认的进程栈大小为8MB,尝试用ulimit -s

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值