0 背景

当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”)。我们可以认为 core dump 是“内存快照”,但实际上,除了内存信息之外,还有些关键的程序运行状态也会同时 dump 下来,例如寄存器信息(包括程序指针、栈指针等)、内存管理信息、其他处理器和操作系统状态和信息。core dump 对于编程人员诊断和调试程序是非常有帮助的,因为对于有些程序错误是很难重现的,例如指针异常,而 core dump 文件可以再现程序出错时的情景。

Segmentation fault (core dumped)多为内存不当操作造成。空指针、野指针的读写操作,数组越界访问,破坏常量等。如对链表的新增和释放包括赋值等等,如出现不当操作都有可能造成程序崩溃。对每个指针声明后进行初始化为NULL是避免这个问题的好办法。排除此问题的最好办法则是调试。

1 打开core dump功能

  • 在终端中输入命令 ulimit -c ,输出的结果为 0,说明默认是关闭 core dump 的,即当程序异常终止时,也不会生成 core dump 文件。
  • 我们可以使用命令 ulimit -c unlimited 来开启 core dump 功能,并且不限制 core dump 文件的大小; 如果需要限制文件的大小,将 unlimited 改成你想生成 core 文件最大的大小,注意单位为 blocks(KB)。
  • 用上面命令只会对当前的终端环境有效,如果想需要永久生效,可以修改文件 /etc/security/limits.conf文件,关于此文件的设置参看 这里 。增加一行:
# /etc/security/limits.conf
#
#Each line describes a limit for a user in the form:
#
#<domain>   <type>   <item>   <value>*          soft     core   unlimited

(或者vim /etc/profile在最后增加ulimit -c unlimited,然后source /etc/profile即可生效)

  • 默认生成的 core 文件保存在可执行文件所在的目录下,文件名就为 core
  • 通过修改 /proc/sys/kernel/core_uses_pid 文件可以让生成 core 文件名是否自动加上 pid 号。例如 echo 1 > /proc/sys/kernel/core_uses_pid ,生成的 core 文件名将会变成 core.pid,其中 pid 表示该进程的 PID。
  • 还可以通过修改 /proc/sys/kernel/core_pattern 来控制生成 core 文件保存的位置以及文件名格式。例如可以用 echo "/tmp/corefile-%e-%p-%t" > /proc/sys/kernel/core_pattern 设置生成的 core 文件保存在 “/tmp/corefile” 目录下,文件名格式为 “core-命令名-pid-时间戳”。

2 使用gdb调试core文件

产生了 core 文件,我们该如何使用该 Core 文件进行调试呢?Linux 中可以使用 GDB 来调试 core 文件,步骤如下:

  • 首先,使用 gcc 编译源文件,加上 -g 以增加调试信息;
  • 按照上面打开 core dump 以使程序异常终止时能生成 core 文件;
  • 运行程序,当core dump 之后,使用命令 gdb program core 来查看 core 文件,其中 program 为可执行程序名,core 为生成的 core 文件名。

下面用一个简单的例子来说明:

#include <stdio.h>
int func(int *p)
{int y = *p;return y;
}
int main()
{int *p = NULL;return func(p);
}

编译加上调试信息,运行之后core dump, 使用 gdb 查看 core 文件.

guohailin@guohailin:~$ gcc core_demo.c -o core_demo -g
guohailin@guohailin:~$ ./core_demo
Segmentation fault (core dumped)guohailin@guohailin:~$ gdb core_demo core_demo.core.24816
...
Core was generated by './core_demo'.
Program terminated with signal 11, Segmentation fault.
#0  0x080483cd in func (p=0x0) at core_demo.c:5
5       int y = *p;
(gdb)  where
#0  0x080483cd in func (p=0x0) at core_demo.c:5
#1  0x080483ef in main () at core_demo.c:12
(gdb) info frame
Stack level 0, frame at 0xffd590a4:eip = 0x80483cd in func (core_demo.c:5); saved eip 0x80483efcalled by frame at 0xffd590c0source language c.Arglist at 0xffd5909c, args: p=0x0Locals at 0xffd5909c, Previous frame's sp is 0xffd590a4Saved registers:ebp at 0xffd5909c, eip at 0xffd590a0
(gdb) 

从上面可以看出,我们可以还原 core_demo 执行时的场景,并使用 where 可以查看当前程序调用函数栈帧, 还可以使用 gdb 中的命令查看寄存器,变量等信息.

Linux之core dumped出错原因及位置分析相关推荐

  1. Linux上Core Dump文件的形成和分析

    Core,又称之为Core Dump文件,是Unix/Linux操作系统的一种机制,对于线上服务而言,Core令人闻之色变,因为出Core的过程意味着服务暂时不能正常响应,需要恢复,并且随着吐Core ...

  2. ORA-01722 无效数字出错原因以及以及分析总结

    转发自:ORACLE-023:令人烦恼的 ora-01722 无效数字 主要原因如下: 1.对于两个类型不匹配(一个数字类型,一个非数字类型,同下)的值进行赋值操作; 2.两个类型不匹配的值进行比较操 ...

  3. core dumped ?完了?

    微信公众号:linux码头 core dumped:当程序在运行过程中发生异常,这时linux系统可以把程序出错的内存 内容存储在一个core文件中,又叫核心转存. 应用程序在运行过程汇总经常会遇到s ...

  4. caffe 报错 Aborted(core dumped

    @[TOC](caffe 报错 Aborted(core dumped)) caffe 报错: Aborted(core dumped) 问题原因 caffe 数据问题,检查数据包

  5. linux内存不足+段错误,Linux系统内存错误产生的原因及调试方法(段错误|core dumped)[转]...

    产生段错误就是访问了错误的内存段,一般是你没有权限,或者根本就不存在对应的物理内存,尤其常见的是访问0地址. 一般来说,段错误就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由gdtr来 ...

  6. 005 Linux系统内存错误产生的原因及调试方法(段错误|core dumped)

    Linux系统内存错误产生的原因及调试方法(段错误|core dumped)[转] Posted on 2008-09-05 14:52 猫头鹰 阅读(84) 评论(0)  编辑 收藏 引用 所属分类 ...

  7. Linux遇到Aborted (core dumped)

    1.问题描述 或出现: 2.关于Core Dump的分析 2.1 什么是Core Dump Core的意思是内存, Dump的意思是扔出来, 堆出来.在开发(或使用)一个程序时,有时程序莫名其妙的do ...

  8. linux 捕获sigsegv信息如何生成core文件,Linux下如何捕获SIGSEGV 的发生位置

    Linux下如何捕获SIGSEGV 的发生位置 发布时间:2008-04-23 01:28:28来源:红联作者:Mwany Linux下编程(尤其是服务端程序)若由于内存越界或其他原因产生" ...

  9. linux段错误core dumped,段错误 (core dumped) 之 core文件

    当我们的程序崩溃时,内核有可能把该程序当前内存映射到core文件里,方便程序员找到程序出现问题的地方.最常出现的,几乎所有C程序员都出现过的错误就是"段错误"了.也是最难查出问题原 ...

最新文章

  1. 三个轻量级WebServer--lighttpd,thttpd,shttpd介绍
  2. 线性代数 2021-2022-1 考试要点
  3. ubuntu10.04下安装Eclipse
  4. qt开发环境 - 丁林松教程,丑陋的计算器
  5. nginx: [error] open() “/usr/local/var/run/nginx.pid“ failed (2: No such file or directory)
  6. 类路径是什么意思_甲状腺结节4a类严重吗,是什么意思?怎么治疗需要手术吗?一文解答...
  7. 二维码的生成和扫描识别
  8. Express使用进阶:cookie-parser中间件实现深入剖析
  9. 系统设计和机器学习算法
  10. 软考-计算机系统知识整理
  11. FusionCharts的使用方法
  12. 批处理变量输出时提示“ECHO处于关闭状态”
  13. win10如何删除计算机用户,Win10系统如何删除账户?Win10系统删除账户的方法
  14. Xenu's Link Sleuth 的使用
  15. 不死僵尸木马lpt7.asp.asp与lpt5.cnzzz.asp的删除方法
  16. 【MySQL篇】第三篇——表的操作
  17. 蓝牙标签与蓝牙信标的区别
  18. 2013年9月19日
  19. 乐鑫esp8266学习rtos3.0笔记:仅1M flash 的安信可 ESP-01S 模块,如何二次开发?如何对其 OTA 远程升级固件!
  20. A Survey on Deep Learning in Medical Image Analysis

热门文章

  1. Termux基础教程(无编程基础动图展示版)
  2. 五、传输层(三)TCP
  3. react18.0.0+ts路由配置
  4. 【微前端开发环境下,加载远程子应用的实战。】
  5. centos安装中文字体
  6. 每次开机都要按F1的解决办法
  7. sencha app watch php,Sencha Cmd使用指南
  8. python调用谷歌地图api_python显示地图与谷歌地图
  9. 海尔笔记本X3超级本拆机增加内存图文教程(解决后盖开不了问题)
  10. 准备嵌入式Linux开发环境