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. 如何远程调试zookeeper集群

    我们在阅读一些源码的时候,如果能调试源代码将会大大的提高我们的阅读效率.最近在学习zookeeper源码,分享下如何调试zookeeper集群. zookeeper代码,调试环境搭建 1.下载zook ...

  2. Centos6.5 源码编译安装 Mysql5.7.11及配置

    安装环境 Linux(CentOS6.5 版).boost_1_59_0.tar.gz.mysql-5.7.11.tar.gzMySQL 5.7主要特性:    更好的性能:对于多核CPU.固态硬盘. ...

  3. php变量双击选择无法选择$符号

    创建/Data/Packages/User/PHP.sublime-settings文件,内容为 {     "word_separators": "./\\()\&qu ...

  4. [leetcode-515-Find Largest Value in Each Tree Row]

    You need to find the largest value in each row of a binary tree. Example: Input:    1   / \  3 2 / \ ...

  5. JQuery事件机制笔记

    一.事件绑定及移除 1.bind() bind()为每个匹配的元素绑定一个或多个事件处理函数: 语法:bind(event,fn)//不能给未来元素添加事件: bind(event,fn); bind ...

  6. Openfire插件开发图解

    概述 Openfire插件开发是Openfire的精髓之一,支持插件热插拔,还可以方便的在web端进行管理插件.插件分为两种,一种是以服务为主的控制台插件,一种是包括页面或对外开放Servlet接口. ...

  7. 【转】JS容器拖拽效果,并通过cookie保存拖拽各容器的所在位置

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. accp8.0转换教材第5章事务、视图、索引、备份和恢复理解与练习

    知识点:事务.视图.索引.数据库的备份和恢复 一.单词部分 ①transation事务②atomicity原子性③consistency一致性④isolation隔离性 ⑤durability持久性⑥ ...

  9. Java探秘之神秘的字符串String(二)

    不可变性 String可以说是最常用的类型了,即字符串类型,String是常量(final关键词修饰的),他的值不能被创建后更改,因为字符串是不可被改变的,所以可以被用来共享. Java语言为Stri ...

  10. QQ空间魔力日志大全SduSRZ

    大家好~最近,在QQ空间里出现了一种神奇的日志,谁看显示谁的信息,在个人中心显示的是一张图片,在日志里显示的又是另一张图片.这就是传说中的魔力日志.魔力日志从今年的9月份开始盛行,因为具有谁看就针对谁 ...