Linux下栈溢出致使的core dump

本文有更新,请移步个人我的博客:https://blog.andyqiao.top/article/7/

 

1 问题产生

  前两天在干活的时候,写好的一个daemon程序,一跑就core,连main函数都进不去。历来没见过这阵势的职场新人被吓尿了,幸亏不是在生产环境上测试。找来同事帮忙,看了很久也没看出问题,你们都认为多是Makefile文件里缺乏相应的库文件形成了。一开始就跑偏了,折腾了一上午也没能解决问题。数组

2 问题解决

  在老司机的建议下,我采用了最粗暴的方法来排查问题:创建新工程,一点点将原代码移入新工程,定位问题所在。因而,复制、粘贴、保存、make clean;make、再运行。终于程序再次core了。看了一下子也没能发现这段代码有什么问题,因而再次缩小范围。最终定位到结果的时候,我连连说了几句,我操!问题居然出在库里的某个头文件定义的结构体里。原来,是被前辈坑了安全

  打开头文件,发现结构体中有这样的一个成员 char buf[20*1024*1024],感受这个成员变量多是问题所在。因而,上网查找相头资料。原来,Linux对于线程的栈大小是有限制的,默认为8M,而这个数组大小为20M。在程序里,这个数组所在的结构体被我用做类的成员变量,而这个类又在main函数里被实例化,因而这么一个巨大的数组就被放在了栈里。为了保护操做系统,程序固然会core了。函数

  找到了问题所在,那么解决问题就很简单了。三种方法:测试

  • 修改数组大小为5M,即5*1024*1024
  • 结构体做为类的成员变量时,手动分配内存,最好使用智能指针。这样,这个大数组必定会被存储在堆里,就不会有栈大小的限制了
  • 修改Linux栈大小的限制

3 知识拓展

  在Linux操做系统中,ulimit -s能够查看当前栈大小限制,也可能得到root权限后,修改栈大小限制。如操作系统

    ulimit -s 102400线程

  能够将栈大小限制修改成100M,这样就不会core了。但这样有两个问题,首先,不安全。Linux之因此对栈大小进行限制,就是为了防止程序无限递归或者使用了过大的栈,是给操做系统加上了一层保护,修改得过大,可能会使系统容易崩溃。而后最重要的是,我并无root权限【那还说个屌】指针

相关文章
相关标签/搜索