最近在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