Linux下栈溢出导致的core dump
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的更多相关文章
- (转)Linux 下栈溢出问题分析解决 *** stack smashing detected *** XXXX terminated
Linux 下栈溢出问题分析解决 *** stack smashing detected *** XXXX terminated 1.利用gdb 或者valgrind 定位到具体的代码 最近在Linu ...
- windows/Linux下设置ASP.Net Core开发环境并部署应用
10分钟学会在windows/Linux下设置ASP.Net Core开发环境并部署应用 创建和开发ASP.NET Core应用可以有二种方式:最简单的方式是通过Visual Studio 2017 ...
- [转载] Linux 下产生和调试core文件
原地址:http://blog.csdn.net/shaovey/article/details/2744487 linux下如何产生core,调试core 在程序不寻常退出时,内核会在当前工作目录下 ...
- 10分钟学会在windows/Linux下设置ASP.Net Core开发环境并部署应用
创建和开发ASP.NET Core应用可以有二种方式:最简单的方式是通过Visual Studio 2017 来创建,其优点是简单方便,但需要安装最新版本Visual Studio 2017 prev ...
- linux下线程调试 ulimit core
在linux 下写线程程序的同学预计都遇到过找bug找到崩溃的情况.多线程情况下bug的追踪实在是不easy. 如今我来介绍一个好用的方法 ulimit core. 先简介一下ulimit是个什么(你 ...
- Linux下卸载删除.Net Core
最近在技术博客和技术交流群遇到很多小伙伴们在Linux下更新或者安装.Net Core SDK后dotnet命令无法识别等问题,现如下解决: 卸载SDK命令 sudo yum remove dotne ...
- Linux下快速手动产生core文件
原文链接:https://blog.csdn.net/jctian000/article/details/79695006 当我们配置好自动生成core文件的环境后,若不想写导致崩溃的程序验证,那要怎 ...
- linux下core dump
1.前言 一直在从事linux下后台开发,经常与core文件打交道.还记得刚开始从事linux下开发时,程序突然崩溃了,也没有任何日志.我不知所措,同事叫我看看core,我却问什么是core,怎么看. ...
- linux下生成core dump文件方法及设置【转】
转自:http://blog.csdn.net/mrjy1475726263/article/details/44116289 源自:http://andyniu.iteye.com/blog/196 ...
随机推荐
- sql with as 用法(转载)
一.WITH AS的含义 WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到.有的时候, ...
- Transparent Application Failover 透明应用切换
官方文档地址 http://docs.oracle.com/cd/E11882_01/network.112/e41945/advcfg.htm#NETAG455 About Transparent ...
- top命令总结
top命令主要用来观察和收集运行在系统上的进程的一些有用信息.ps只是一个快照,是ps命令执行的那一瞬间的系统中进程的快照.top则可以用于持续观察. 第一步,在命令行键入top,回车进入top管理界 ...
- php产生随机字符串
/** * 产生随机字符串 * * @param int $length 输出长度 * @param string $chars 可选的 ,默认为 0123456789 * @return strin ...
- thinkphp之获取客户端IP地址
/** * 获取客户端IP地址 * @param integer $type 返回类型 0 返回IP地址 1 返回IPV4地址数字 * @return mixed */ function get_cl ...
- 【LeetCode】141. Linked List Cycle
题目: Given a linked list, determine if it has a cycle in it. Follow up:Can you solve it without using ...
- struts2框架下的一个简单的ajax例子
举个例子 jsp页面: <%@ page language="java" import="java.util.*" pageEncoding=" ...
- H3CNE实验:配置交换机接口
第1步:配置交换机端口 <H3C>system-view System View: return to User View with Ctrl+Z. [H3C]interface Giga ...
- redis内存管理
Redis主要通过控制内存上线和回收策略来实现内存管理. 1. 设置内存上限 redis使用maxmemory参数限制最大可用内存.限制的目的主要有: 用户缓存场景,当超出内存上限maxmemory时 ...
- centos6.5下redis安装步骤总结
1.首先下载一个版本 我用的是3.2.9 解压:tar -zxvf /redis-stable.tar.gz 在/usr/local/新建redis文件夹 然后把解压好的文件夹移动到/usr/loca ...