前两天在干活的时候,写好的一个daemon程序,一跑就core,连main函数都进不去。历来没见过这阵势的职场新人被吓尿了,幸亏不是在生产环境上测试。找来同事帮忙,看了很久也没看出问题,你们都认为多是Makefile文件里缺乏相应的库文件形成了。一开始就跑偏了,折腾了一上午也没能解决问题。数组
在老司机的建议下,我采用了最粗暴的方法来排查问题:创建新工程,一点点将原代码移入新工程,定位问题所在。因而,复制、粘贴、保存、make clean;make、再运行。终于程序再次core了。看了一下子也没能发现这段代码有什么问题,因而再次缩小范围。最终定位到结果的时候,我连连说了几句,我操!问题居然出在库里的某个头文件定义的结构体里。原来,是被前辈坑了。安全
打开头文件,发现结构体中有这样的一个成员 char buf[20*1024*1024],感受这个成员变量多是问题所在。因而,上网查找相头资料。原来,Linux对于线程的栈大小是有限制的,默认为8M,而这个数组大小为20M。在程序里,这个数组所在的结构体被我用做类的成员变量,而这个类又在main函数里被实例化,因而这么一个巨大的数组就被放在了栈里。为了保护操做系统,程序固然会core了。函数
找到了问题所在,那么解决问题就很简单了。三种方法:测试
在Linux操做系统中,ulimit -s能够查看当前栈大小限制,也可能得到root权限后,修改栈大小限制。如操作系统
ulimit -s 102400线程
能够将栈大小限制修改成100M,这样就不会core了。但这样有两个问题,首先,不安全。Linux之因此对栈大小进行限制,就是为了防止程序无限递归或者使用了过大的栈,是给操做系统加上了一层保护,修改得过大,可能会使系统容易崩溃。而后最重要的是,我并无root权限【那还说个屌】指针