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的原因

  1. 内存访问越界
    a) 由于使用错误的下标,导致数组访问越界。
    b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符。
    c) 使用strcpy, strcat, sprintf, strcmp,strcasecmp等字符串操作函数,将目标字符串读/写爆。
  2. 多线程程序使用了线程不安全的函数。
  3. 多线程读写的数据未加锁保护。
    对于会被多个线程同时访问的全局数据,应该注意加锁保护,否则很容易造成coredump
  4. 非法指针
    a) 使用空指针
    b) 随意使用指针转换。一个指向一段内存的指针,除非确定这段内存原先就分配为某种结构或类型,或者这种结构或类型的数组,否则不要将它转换为这种结构或类型的指针,而应该将这段内存拷贝到一个这种结构或类型中,再访问这个结构或类型。这是因为如果这段内存的开始地址不是按照这种结构或类型对齐的,那么访问它时就很容易因为bus error而core dump。
  5. 堆栈溢出
    不要使用大的局部变量(因为局部变量都分配在栈上),这样容易造成堆栈溢出,破坏系统的栈和堆结构,导致出现莫名其妙的错误。

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详解相关推荐

  1. Segment fault及LINUX core dump详解

    C 程序在进行中发生segment fault(core dump)错误,通常与内存操作不当有关,主要有以下几种情况: (1)数组越界. (2)修改了只读内存. (3)scanf("%d&q ...

  2. 段错误调试神器 - Core Dump详解

    一.前言: 有的程序可以通过编译, 但在运行时会出现Segment fault(段错误). 这通常都是指针错误引起的. 但这不像编译错误一样会提示到文件某一行, 而是没有任何信息, 使得我们的调试变得 ...

  3. linux中jstack命令详解,Linux jstack命令详解

    jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息. 如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack ...

  4. Linux /dev目录详解和Linux系统各个目录的作用

    Linux /dev目录详解和Linux系统各个目录的作用 标签: linuxtcpfunctionclassfirefoxtimer 2012-01-11 23:08 45517人阅读 评论(2) ...

  5. linux系统安全详解

    linux系统安全详解 http://www.2cto.com/Article/201207/142181.html一,BIOS安全(硬件上的安全) 1,最基本最简单的安全配置,保障计算机硬件配置等不 ...

  6. 红帽Linux故障定位技术详解与实例(1)

    红帽Linux故障定位技术详解与实例(1) 2011-09-28 14:26 圈儿 BEAREYES.COM 我要评论(0) 字号:T | T 在线故障定位就是在故障发生时, 故障所处的操作系统环境仍 ...

  7. 红帽Linux故障定位技术详解与实例(3)

    红帽Linux故障定位技术详解与实例(3) 在线故障定位就是在故障发生时, 故障所处的操作系统环境仍然可以访问,故障处理人员可通过console, ssh等方式登录到操作系统上,在shell上执行各种 ...

  8. 【网络编程】Linux tcpdump命令详解---编辑中

    目录 即看即用 详细说明 简介 输出信息含义 链路层头 TCP 数据包 UDP 数据包 SMB/CIFS 解码 AFS 请求和回应 KIP AppleTalk协议 IP 数据包破碎 时间戳 反向过滤 ...

  9. linux abs函数怎么用,Linux输入子系统详解

    原标题:Linux输入子系统详解 纯手工打造每一篇开源资讯与技术干货,数十万程序员和Linuxer已经关注. 导读 linux输入子系统由驱动层.输入子系统核心.事件处理层三部分组成.一个输入事件,如 ...

  10. Linux常用命令详解(最全)

    Linux命令目录 Linux命令集合 系统信息 关机 (系统的关机.重启以及登出 ) 文件和目录 文件搜索 挂载一个文件系统 磁盘空间 用户和群组 文件的权限 - 使用 "+" ...

最新文章

  1. [MySql]锁表与解锁
  2. leangoo新增自定义模板、移动卡片、复制泳道功能
  3. MPB:邓晔、王尚等-​环境样本中的细菌总量测定—流式细胞法
  4. android 评论输入框(PopupWindow)
  5. 搭建pxe环境安装系统
  6. 基于MySQL的调度系统_仓储调度系统的设计与实现(SSH,MySQL)
  7. 【Hibernate步步为营】--核心对象+持久对象全析(二)
  8. 嵌入式linux ucgui,Helper2416开发板移植ucgui(嵌入式linux运行ucgui)
  9. Linux环境安装之Ant
  10. 开发板运行可执行文件提示not found的问题
  11. Seagate 日立硬盘型号命名规则
  12. C#时间/日期格式大全
  13. linux代码布局,Linux内存布局(示例代码)
  14. Python如何导入自己编写的py文件(.pyx文件 .pyd文件)
  15. 利用matplotlib将图片放入三维坐标里
  16. 读书有感:《睡眠革命》
  17. 1w存银行一年多少利息_100万存银行,一年利息有多少?
  18. “浏览器设置从上次停下的地方继续,但是电脑重启打开后还是主页”问题的解决办法
  19. 100行matlab,中国大学MOOC: Matlab中可以产生100行100列元素全是1的正确的命令是() 答案:ones(100)...
  20. EJB3+JBoss5+Myeclipse9创建HelloWorld实例

热门文章

  1. 【分治算法】大整数乘法
  2. 内网渗透(四十六)之横向移动篇-使用系统漏洞ms17010横向移动
  3. 95后沪漂女孩深陷“狠”且“卷”职场,向上思维,永不过时!
  4. CATEGORICAL REPARAMETERIZATION WITH GUMBEL-SOFTMAX翻译
  5. JMeter参数化post请求
  6. 十大领域五大过程组(上):你必须了解的项目管理常识
  7. DOM基本知识及DOM查询
  8. matlab bsxfun memory,[转]matlab函数 bsxfunarrayfun
  9. 简述下列​概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构
  10. find_element()和find_elements()的区别