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

Linux下栈溢出导致的core dump的更多相关文章

  1. (转)Linux 下栈溢出问题分析解决 *** stack smashing detected *** XXXX terminated

    Linux 下栈溢出问题分析解决 *** stack smashing detected *** XXXX terminated 1.利用gdb 或者valgrind 定位到具体的代码 最近在Linu ...

  2. windows/Linux下设置ASP.Net Core开发环境并部署应用

    10分钟学会在windows/Linux下设置ASP.Net Core开发环境并部署应用 创建和开发ASP.NET Core应用可以有二种方式:最简单的方式是通过Visual Studio 2017 ...

  3. [转载] Linux 下产生和调试core文件

    原地址:http://blog.csdn.net/shaovey/article/details/2744487 linux下如何产生core,调试core 在程序不寻常退出时,内核会在当前工作目录下 ...

  4. 10分钟学会在windows/Linux下设置ASP.Net Core开发环境并部署应用

    创建和开发ASP.NET Core应用可以有二种方式:最简单的方式是通过Visual Studio 2017 来创建,其优点是简单方便,但需要安装最新版本Visual Studio 2017 prev ...

  5. linux下线程调试 ulimit core

    在linux 下写线程程序的同学预计都遇到过找bug找到崩溃的情况.多线程情况下bug的追踪实在是不easy. 如今我来介绍一个好用的方法 ulimit core. 先简介一下ulimit是个什么(你 ...

  6. Linux下卸载删除.Net Core

    最近在技术博客和技术交流群遇到很多小伙伴们在Linux下更新或者安装.Net Core SDK后dotnet命令无法识别等问题,现如下解决: 卸载SDK命令 sudo yum remove dotne ...

  7. Linux下快速手动产生core文件

    原文链接:https://blog.csdn.net/jctian000/article/details/79695006 当我们配置好自动生成core文件的环境后,若不想写导致崩溃的程序验证,那要怎 ...

  8. linux下core dump

    1.前言 一直在从事linux下后台开发,经常与core文件打交道.还记得刚开始从事linux下开发时,程序突然崩溃了,也没有任何日志.我不知所措,同事叫我看看core,我却问什么是core,怎么看. ...

  9. linux下生成core dump文件方法及设置【转】

    转自:http://blog.csdn.net/mrjy1475726263/article/details/44116289 源自:http://andyniu.iteye.com/blog/196 ...

随机推荐

  1. linux 下tomcat的安装

    写在前面: 由于项目使用jdk1.6开发,所以对应服务器应安装jdk1.6和tomcat6 --- 1.环境变量的配置: 打开/etc/bashrc配置环境变量 JAVA_HOME=/usr/apps ...

  2. html之改变图片透明度而不改变文字的透明度--两种方法实现

    图片与图片上的文字设置不同的透明度的两种方法: 第一种方法:背景图+定位+background: url(timg.jpg)no-repeat; <!DOCTYPE html> <h ...

  3. kbengine新手教程

    KBEngine服务端引擎开源项目地址(github):https://github.com/kbengine/kbengine引擎下载与编译:http://kbengine.org/cn/docs/ ...

  4. 仿网易新闻app下拉标签选择菜单

    仿网易新闻app下拉标签选择菜单 仿网易新闻app下拉标签选择菜单,长按拖动排序,点击增删标签控件 ##示例  ##EasyTagDragView的使用 在layout布局里添加:  

  5. VMwareTools安装失败提示找不到C headers和gcc目录

    在VMware虚拟机上安装好linux系统后,发现往往不能全屏,也不能设置共享文件夹进行文件共享,这时候可以通过安装VMwareTools这个工具来实现文件拖拽.共享和全屏. 安装的过程不再赘述,关键 ...

  6. Struts2请求参数合法性校验机制

    在Action中通过代码执行数据校验 请求参数的输入校验途径一般分两种:客户端校验 :通过JavaScript 完成 (jquery validation插件),目的:过滤正常用户的误操作. 服务器校 ...

  7. 小解系列-自关联对象.Net MVC中 json序列化循环引用问题

    自关联对象在实际开发中用的还是比较多,例如常见的树形菜单.本文是自己实际的一个小测试,可以解决循环引用对象的json序列化问题,文笔不好请多见谅,如有错误请指出,希望有更好的解决方案,一起进步. 构造 ...

  8. Oracle之plsql快速入门

    打开系统输出 set serveroutput on; 只需要打开一次**书写格式 以斜杠/号 结束(基本结构) --declare --语句后面必须以;号结束 declare --用来区分变量名和表 ...

  9. Java后端开发书架

    本人摘录于江南白衣文章,文章地址:http://calvin1978.blogcn.com/articles/javabookshelf.html 书架主要针对Java后端开发. 3.0版把一些后来买 ...

  10. 以Random Forests和AdaBoost为例介绍下bagging和boosting方法

    我们学过决策树.朴素贝叶斯.SVM.K近邻等分类器算法,他们各有优缺点:自然的,我们可以将这些分类器组合起来成为一个性能更好的分类器,这种组合结果被称为 集成方法 (ensemble method)或 ...