Linux-core dump详解
core dump
首先解释什么是core dump。
当一个进程要异常终止时,可以选择把进程的用户空间内存数据全部保存到磁盘上,文件名通常是core,这叫做core dump-核心转储。进程异常终止时因为有BUG,比如非法访问内存导致段错误。事后可以用调试器检查core文件以查清错误原因,这叫做事后调试。
一个进程允许产生多大的core文件,取决于进程的Resource Limit。默认是不允许产生core文件的。在开发调试阶段可以用ulimit命令改变这个限制,允许产生core文件。
基于以上,总结了几点:
1.核心转储只能用于开发调试阶段
如果在程序允许期间或者是项目上线后,仍然可以核心转储,会带来许多问题,由于core dump是将用户数据全部写入硬盘,可能一次错误产生的数据就会将硬盘写满。其次,上线了的项目如果能够把所有数据通过core dump写入硬盘,显然这是不安全的 ,尤其是在包含密码等敏感信息时。所以core dump只能在开发调试阶段使用。
2.核心转储默认是不被开启的
同样,基于以上原因,核心转储是默认不被开启的。如何开启调试后面会说。
3.造成core dump的原因
- 内存访问越界
a) 由于使用错误的下标,导致数组访问越界。
b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符。
c) 使用strcpy, strcat, sprintf, strcmp,strcasecmp等字符串操作函数,将目标字符串读/写爆。 - 多线程程序使用了线程不安全的函数。
- 多线程读写的数据未加锁保护。
对于会被多个线程同时访问的全局数据,应该注意加锁保护,否则很容易造成coredump - 非法指针
a) 使用空指针
b) 随意使用指针转换。一个指向一段内存的指针,除非确定这段内存原先就分配为某种结构或类型,或者这种结构或类型的数组,否则不要将它转换为这种结构或类型的指针,而应该将这段内存拷贝到一个这种结构或类型中,再访问这个结构或类型。这是因为如果这段内存的开始地址不是按照这种结构或类型对齐的,那么访问它时就很容易因为bus error而core dump。 - 堆栈溢出
不要使用大的局部变量(因为局部变量都分配在栈上),这样容易造成堆栈溢出,破坏系统的栈和堆结构,导致出现莫名其妙的错误。
4.core dump如何定位
通常情况下,core文件会包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息等,我们可以理解为是程序工作当前状态 存储生成第一个文件,许多的程序出错的时候都会产生一个core文件,通过工具分析这个文件,我们可以定位到程序异常退出的时候对应的堆栈调用等信息,找出问题所在并进行及时解决。
举个例子说明:
首先用一个会产生段错误的例子:
#include <stdio.h>
int main()
{int *p;*p=100;return 0;
}
首先编译运行看看会出现什么。
可以看到编译通过没问题,运行发现产生了段错误,core dump错误。
接下来,更改core文件大小。
用ulimit -a命令查看内存大小。
ulimit -a
可以看到core文件默认大小是0.
更改core文件大小用:
ulimit -c 1024
将core文件更改为1024。就可以产生core文件了。
再次查看,发现已经被更改了。
再次编译,通过编译。然后运行,仍然是段错误。但是此时发现在该路径下产生了一个core文件。
Linux下用gdb调试器用来调试。用gdb调试该程序,要加上core文件就能定位出段错误的位置。
可以看到,调试器已经帮我们将错误定位出来了,并且将原因及行号显示出来了。
Linux-core dump详解相关推荐
- Segment fault及LINUX core dump详解
C 程序在进行中发生segment fault(core dump)错误,通常与内存操作不当有关,主要有以下几种情况: (1)数组越界. (2)修改了只读内存. (3)scanf("%d&q ...
- 段错误调试神器 - Core Dump详解
一.前言: 有的程序可以通过编译, 但在运行时会出现Segment fault(段错误). 这通常都是指针错误引起的. 但这不像编译错误一样会提示到文件某一行, 而是没有任何信息, 使得我们的调试变得 ...
- linux中jstack命令详解,Linux jstack命令详解
jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息. 如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack ...
- Linux /dev目录详解和Linux系统各个目录的作用
Linux /dev目录详解和Linux系统各个目录的作用 标签: linuxtcpfunctionclassfirefoxtimer 2012-01-11 23:08 45517人阅读 评论(2) ...
- linux系统安全详解
linux系统安全详解 http://www.2cto.com/Article/201207/142181.html一,BIOS安全(硬件上的安全) 1,最基本最简单的安全配置,保障计算机硬件配置等不 ...
- 红帽Linux故障定位技术详解与实例(1)
红帽Linux故障定位技术详解与实例(1) 2011-09-28 14:26 圈儿 BEAREYES.COM 我要评论(0) 字号:T | T 在线故障定位就是在故障发生时, 故障所处的操作系统环境仍 ...
- 红帽Linux故障定位技术详解与实例(3)
红帽Linux故障定位技术详解与实例(3) 在线故障定位就是在故障发生时, 故障所处的操作系统环境仍然可以访问,故障处理人员可通过console, ssh等方式登录到操作系统上,在shell上执行各种 ...
- 【网络编程】Linux tcpdump命令详解---编辑中
目录 即看即用 详细说明 简介 输出信息含义 链路层头 TCP 数据包 UDP 数据包 SMB/CIFS 解码 AFS 请求和回应 KIP AppleTalk协议 IP 数据包破碎 时间戳 反向过滤 ...
- linux abs函数怎么用,Linux输入子系统详解
原标题:Linux输入子系统详解 纯手工打造每一篇开源资讯与技术干货,数十万程序员和Linuxer已经关注. 导读 linux输入子系统由驱动层.输入子系统核心.事件处理层三部分组成.一个输入事件,如 ...
- Linux常用命令详解(最全)
Linux命令目录 Linux命令集合 系统信息 关机 (系统的关机.重启以及登出 ) 文件和目录 文件搜索 挂载一个文件系统 磁盘空间 用户和群组 文件的权限 - 使用 "+" ...
最新文章
- [MySql]锁表与解锁
- leangoo新增自定义模板、移动卡片、复制泳道功能
- MPB:邓晔、王尚等-​环境样本中的细菌总量测定—流式细胞法
- android 评论输入框(PopupWindow)
- 搭建pxe环境安装系统
- 基于MySQL的调度系统_仓储调度系统的设计与实现(SSH,MySQL)
- 【Hibernate步步为营】--核心对象+持久对象全析(二)
- 嵌入式linux ucgui,Helper2416开发板移植ucgui(嵌入式linux运行ucgui)
- Linux环境安装之Ant
- 开发板运行可执行文件提示not found的问题
- Seagate 日立硬盘型号命名规则
- C#时间/日期格式大全
- linux代码布局,Linux内存布局(示例代码)
- Python如何导入自己编写的py文件(.pyx文件 .pyd文件)
- 利用matplotlib将图片放入三维坐标里
- 读书有感:《睡眠革命》
- 1w存银行一年多少利息_100万存银行,一年利息有多少?
- “浏览器设置从上次停下的地方继续,但是电脑重启打开后还是主页”问题的解决办法
- 100行matlab,中国大学MOOC: Matlab中可以产生100行100列元素全是1的正确的命令是() 答案:ones(100)...
- EJB3+JBoss5+Myeclipse9创建HelloWorld实例
热门文章
- 【分治算法】大整数乘法
- 内网渗透(四十六)之横向移动篇-使用系统漏洞ms17010横向移动
- 95后沪漂女孩深陷“狠”且“卷”职场,向上思维,永不过时!
- CATEGORICAL REPARAMETERIZATION WITH GUMBEL-SOFTMAX翻译
- JMeter参数化post请求
- 十大领域五大过程组(上):你必须了解的项目管理常识
- DOM基本知识及DOM查询
- matlab bsxfun memory,[转]matlab函数 bsxfunarrayfun
- 简述下列​概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构
- find_element()和find_elements()的区别