首页 技术 正文
技术 2022年11月7日
0 收藏 777 点赞 935 浏览 871 个字

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权限【那还说个屌】

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,088
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,564
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,412
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,185
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,822
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,905