详解coredump

2023-05-16

1、什么是coredump:

2、开启或关闭core文件的生成:

3、core文件的存储位置和文件名:

4、造成程序core的原因(参考):

5、用GDB调试coredump:


1、什么是coredump:

    我们经常听到大家说到程序core掉了,需要定位解决,这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止,并且在满足一定条件下会产生一个叫做core的文件。
    通常情况下,core文件会包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息等,我们可以理解为是程序工作当前状态存储生成的一个文件,许多的程序出错的时候都会产生一个core文件,通过工具分析这个文件,我们可以定位到程序异常退出的时候对应的堆栈调用等信息,找出问题所在并进行及时解决。

2、开启或关闭core文件的生成:

(1)查看core文件是否打开:

ulimit -c  # 如果为 0 表示coredump开关处于关闭状态

(2)打开core文件生成: 

ulimit -c 1024         # 1024个blocks,一般1block=512bytes
ulimit -c unlimited    # 取消大小限制

(3)检查core文件的选项是否打开:

ulimit -a  # 显示当前所有limit信息
命令参数      描述                                          例子
-H    设置硬资源限制,一旦设置不能增加。                      ulimit – Hs 64;限制硬资源,线程栈大小为 64K。
-S    设置软资源限制,设置后可以增加,但是不能超过硬资源设置。  ulimit – Sn 32;限制软资源,32 个文件描述符。
-a    显示当前所有的 limit 信息                             ulimit – a;显示当前所有的 limit 信息
-c    最大的 core 文件的大小, 以 blocks 为单位              ulimit – c unlimited; 对生成的 core 文件的大小不进行限制
-d    进程最大的数据段的大小,以 Kbytes 为单位                ulimit -d unlimited;对进程的数据段大小不进行限制
-f    进程可以创建文件的最大值,以 blocks 为单位              ulimit – f 2048;限制进程可以创建的最大文件大小为 2048 blocks
-l    最大可加锁内存大小,以 Kbytes 为单位                   ulimit – l 32;限制最大可加锁内存大小为 32 Kbytes
-m    最大内存大小,以 Kbytes 为单位                         ulimit – m unlimited;对最大内存不进行限制
-n    可以打开最大文件描述符的数量                           ulimit – n 128;限制最大可以使用 128 个文件描述符
-p    管道缓冲区的大小,以 Kbytes 为单位                     ulimit – p 512;限制管道缓冲区的大小为 512 Kbytes
-s    线程栈大小,以 Kbytes 为单位                          ulimit – s 512;限制线程栈的大小为 512 Kbytes
-t    最大的 CPU 占用时间,以秒为单位                        ulimit – t unlimited;对最大的 CPU 占用时间不进行限制
-u    用户最大可用的进程数                                  ulimit – u 64;限制用户最多可以使用 64 个进程
-v    进程最大可用的虚拟内存,以 Kbytes 为单位               ulimit – v 200000;限制最大可用的虚拟内存为 200000 Kbytes

(4) 永久配置core:

    以上配置只对当前会话起作用,下次重新登陆后,还是得重新配置。要想配置永久生效,得在/etc/profile或者/etc/security/limits.conf文件中进行配置。

    1)第一种方式:首先打开/etc/profile文件,一般都可以在文件中找到这句语句:ulimit -S -c 0 > /dev/null 2>&1,根据上面的例子,我们只要把那个0 改为 unlimited 就ok了。然后保存退出。通过source /etc/profile 使当期设置生效。或者想配置只针对某一用户有效,则修改此用户的~/.bashrc或者~/.bash_profile文件:

limit -c unlimited

    2)第二种方式:第二种方法可以通过修改/etc/security/limits.conf文件来设置,首先以root权限登陆,然后打开/etc/security/limits.conf文件,进行配置:

#vim /etc/security/limits.conf
<domain>    <type>    <item>        <value>

*          soft       core         unlimited

3、core文件的存储位置和文件名:

(1)存储位置:

    core文件默认的存储位置与对应的可执行程序在同一目录下,文件名是core,可以通过下面的命令看到core文件的存在位置:

cat  /proc/sys/kernel/core_pattern  # 缺省值是|/usr/share/apport/apport %p %s %c %P

    注意:这里是指在进程当前工作目录的下创建。通常与程序在相同的路径下。但如果程序中调用了chdir函数,则有可能改变了当前工作目录。这时core文件创建在chdir指定的路径下。有好多程序崩溃了,我们却找不到core文件放在什么位置。和chdir函数就有关系。当然程序崩溃了不一定都产生 core文件。 

    更改coredump文件的存储位置:

echo “/data/coredump/core”> /proc/sys/kernel/core_pattern  # 把core文件生成到/data/coredump/core目录下

(2)core文件的命名:

    缺省情况下,内核在coredump时所产生的core文件放在与该程序相同的目录中,并且文件名固定为core。很显然,如果有多个程序产生core文件,或者同一个程序多次崩溃,就会重复覆盖同一个core文件,因此我们有必要对不同程序生成的core文件进行分别命名。 

    1)/proc/sys/kernel/core_uses_pid可以控制core文件的文件名中是否添加pid作为扩展。文件内容为1,表示添加pid作为扩展名,生成的core文件格式为core.xxxx;为0则表示生成的core文件同一命名为core。可通过以下命令修改此文件:

echo "1" > /proc/sys/kernel/core_uses_pid

    2)proc/sys/kernel/core_pattern可以控制core文件保存位置和文件名格式,可通过以下命令修改此文件:

echo "/corefile/core-%e-%p-%t" > core_pattern # 可以将core文件统一生成到/corefile目录下,产生的文件名为core-命令名-pid-时间戳

   以下是参数列表:

%% - 单个%字符
%p - 添加pid
%u - 添加当前uid
%g - 添加当前gid
%s - 添加导致产生core的信号
%t - 添加core文件生成时的unix时间
%h - 添加主机名
%e - 添加程序文件名 

4、造成程序core的原因(参考):

    造成程序coredump的原因有很多,这里总结一些比较常用的经验吧:

 (1)内存访问越界:
   a) 由于使用错误的下标,导致数组访问越界。
   b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符。
   c) 使用strcpy, strcat, sprintf, strcmp,strcasecmp等字符串操作函数,将目标字符串读/写爆。应该使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函数防止读写越界。

 (2)多线程程序使用了线程不安全的函数:
      应该使用下面这些可重入的函数,它们很容易被用错:

    asctime_r(3c) 、gethostbyname_r(3n) 、getservbyname_r(3n)、ctermid_r(3s) 、gethostent_r(3n) 、getservbyport_r(3n)、 ctime_r(3c) 、getlogin_r(3c)、getservent_r(3n) 、fgetgrent_r(3c) 、getnetbyaddr_r(3n) 、getspent_r、(3c)fgetpwent_r、(3c) getnetbyname_r(3n)、 getspnam_r(3c)、 fgetspent_r(3c)、getnetent_r(3n) 、gmtime_r(3c)、 gamma_r(3m) 、getnetgrent_r(3n) 、lgamma_r(3m) 、getauclassent_r(3)、getprotobyname_r(3n) 、localtime_r(3c) 、getauclassnam_r(3) 、etprotobynumber_r(3n)、nis_sperror_r(3n) 、getauevent_r(3) 、getprotoent_r(3n) 、rand_r(3c) 、getauevnam_r(3)、getpwent_r(3c) 、readdir_r(3c) 、getauevnum_r(3) 、getpwnam_r(3c) 、strtok_r(3c)、 getgrent_r(3c)、getpwuid_r(3c) 、tmpnam_r(3s) 、getgrgid_r(3c) 、getrpcbyname_r(3n)、 ttyname_r(3c)、getgrnam_r(3c) 、getrpcbynumber_r(3n) 、gethostbyaddr_r(3n) 、getrpcent_r(3n)

  (3)多线程读写的数据未加锁保护:

    对于会被多个线程同时访问的全局数据,应该注意加锁保护,否则很容易造成coredump。

 (4)非法指针:

    a) 使用空指针;
    b) 随意使用指针转换。一个指向一段内存的指针,除非确定这段内存原先就分配为某种结构或类型,或者这种结构或类型的数组,否则不要将它转换为这种结构或类型的指针,而应该将这段内存拷贝到一个这种结构或类型中,再访问这个结构或类型。这是因为如果这段内存的开始地址不是按照这种结构或类型对齐的,那么访问它时就很容易因为bus error而core dump。

 (5)堆栈溢出:
    不要使用大的局部变量(因为局部变量都分配在栈上),这样容易造成堆栈溢出,破坏系统的栈和堆结构,导致出现莫名其妙的错误。  

5、用GDB调试coredump:

    其实分析coredump的工具有很多,现在大部分类unix系统都提供了分析coredump文件的工具,不过,我们经常用到的工具是gdb。 这里我们以程序为例子来说明如何进行定位,使用gdb调试core文件来查找程序中出现段错误的位置时,要注意的是可执行程序在编译的时候需要加上-g编译命令选项。

(1)core.cpp的文件如下:

#include<stdio.h>

void core_test1(){
	int i=0;
	scanf("%d",i);
	printf("%d\n",i);
}
void core_test2(){
	char *ptr = "my name is hello world";
	*ptr = 0;
}

int main(){
	core_test1();
	return 0;
}

  编译:

g++ -g core.cpp -o test 

 运行:

./test

12
Segmentation fault (core dumped)   # 可以看到,当输入12的时候,系统提示段错误并且core dumped

(2)判断是否为core文件:

    在类unix系统下,coredump文件本身主要的格式也是ELF格式,可以通过简单的file命令进行快速判断:

file core.xxxxx

输出:
core.11691: ELF 64-bit LSB core file x86-64, version 1 (SYSV), SVR4-style, from './test'

(3)使用GDB调试

第一种方法(推荐):
    1)启动gdb,进入core文件,命令格式:gdb [exec file] [core file],用法示例:

gdb ./test core.xxxxx

    2)在进入gdb后,查找段错误位置:where或者bt,用法示例:

bt
#0  0x00007f205b7afde5 in _IO_vfscanf_internal (s=<optimized out>, format=<optimized out>, argptr=argptr@entry=0x7ffdf417be88, 
    errp=errp@entry=0x0) at vfscanf.c:1902
#1  0x00007f205b7ba87b in __scanf (format=<optimized out>) at scanf.c:33
#2  0x0000000000400589 in core_test1 () at core.cpp:5
#3  0x00000000004005bf in main () at core.cpp:15

第二种方法:
    1)启动gdb,进入core文件,命令格式:

gdb -c [core file]  //或 gdb --core=[core file]

(2)在进入gdb后,指定core文件对应的符号表,命令格式:

(gdb) file [exec file]

(3)查找段错误位置:where或者bt。用法示例:

 bt

参考:https://blog.csdn.net/tenfyguo/article/details/8159176

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

详解coredump 的相关文章

  • 详解coredump

    1 什么是coredump xff1a 2 开启或关闭core文件的生成 xff1a 3 core文件的存储位置和文件名 xff1a 4 造成程序core的原因 xff08 参考 xff09 xff1a 5 用GDB调试coredump x
  • Coredump 详解

    引言 当程序运行的过程中异常终止或崩溃 操作系统会将程序当时的内存状态记录下来 保存在一个文件中 core文件 这种行为就叫做 Core Dump 或者叫做 核心转储 利用 coredump 可以帮助我们快速定位程序崩溃位置 开启 core
  • 在 Linux 中使用 Core Dump 检查点/重新启动

    可以使用进程的核心转储来实现检查点 重启吗 核心文件包含进程的完整内存转储 因此理论上应该可以 将进程恢复到转储核心时的相同状态 是的 这是可能的 GNU Emacs 这样做是为了优化其启动时间 它加载一堆 Lisp 文件来生成图像 然后转
  • 无法为崩溃的程序创建核心文件

    我正在使用 Ubuntu 12 04 LTS 我写了一个简单的程序如下来创建崩溃 null c include
  • 我有一个可执行文件的核心转储,该可执行文件不是使用调试符号构建的。我可以恢复 argv 内容吗?

    我有一个可执行文件的核心转储 该可执行文件不是使用调试符号构建的 我可以恢复 argv 内容以查看命令行是什么吗 如果我运行 gdb 我可以看到回溯 并且可以导航到 main 框架 一旦到达那里 有没有办法在不知道其确切地址的情况下恢复 a
  • 如何分析 Java 核心转储中的信息? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 如果一个进程崩溃并留下核心转储或者我创建一个gcore那我该如何分析呢 我希望能够使用jmap jstack jstat等等 还可以查看所有变量的值 这样我就可以找到 JVM 崩溃或
  • 如何以编程方式在 C/C++ 中引发核心转储

    我想在我的 C 应用程序中的特定位置强制进行核心转储 我知道我可以通过执行以下操作来做到这一点 int crash NULL crash 1 但我想知道是否有更干净的方法 顺便说一句 我正在使用Linux 发出 6 号信号 SIGABRT在
  • 内存损坏

    我正在运行一个小C程序 include
  • 递归导致的分段错误

    我正在编写一个程序 该程序将获取 1 10 之间的数字并显示排列数字的所有可能方式 前任 输入 3 输出 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 每当我输入 9 或 10 时 程序就会给出分段错误并转储核心
  • 如果应用程序处于 GC 中,如何可靠地获取 JVM 核心转储?

    我正在尝试查找 java 应用程序中内存泄漏的原因 我需要为某个进程获取堆转储longGC 循环 Jmap 在这种情况下不起作用 因为应用程序被挂起 而且堆非常大 不幸的是 jmap 在我获取的核心转储上抛出 UnknownOopExcep
  • 当程序有命令行参数时,如何使用 GDB 分析程序的核心转储文件?

    我的程序是这样运行的 exe p param1 i param2 o param3 它崩溃并生成一个核心转储文件 core pid 我想通过以下方式分析核心转储文件 gdb exe p param1 i param2 o param3 co
  • 避免将信息转储到核心文件中

    我想避免将程序中的某些信息转储到核心文件中 以防发生任何崩溃 为此 我可以使用 coredump filter http man7 org linux man pages man5 core 5 html http man7 org lin
  • 如何在 Linux 中针对分段错误生成核心转储?

    我的 Linux 中有一个进程出现分段错误 我怎样才能告诉它在失败时生成核心转储 这取决于您使用的 shell 如果您使用的是 bash 则 ulimit 命令控制与程序执行相关的多个设置 例如是否应该转储核心 如果您输入 ulimit c
  • 使用 fscanf 读入指针时出现分段错误(核心转储)

    我试图使用 fscanf 读取和打印屏幕上的每个字符 但是当我运行程序时出现分段错误 核心转储 这是我的代码 include
  • 是否可以获得正在运行的进程及其符号表的核心转储?

    是否可以获取 gdb 或使用其他一些工具来创建正在运行的进程及其符号表的核心转储 如果有一种方法可以在不终止进程的情况下执行此操作 那就太好了 如果可能的话 您会使用什么命令 我正在尝试在 Linux 机器上执行此操作 Or run gco
  • gdb coredump - 调用函数或继续执行

    我寻找过与我类似的问题 但我发现的最接近的是GDB 出现 SegFault 后继续调试 https stackoverflow com q 58374854 1667513 我的目标是从 coredump 调用 GDB 中的函数 我有一个
  • 您可以冻结 C/C++ 进程并在不同的主机上继续它吗?

    我想知道是否可以生成一个 核心 文件 将其复制到另一台机器 然后继续在那台机器上执行核心文件 我见过 gcore 实用程序 它可以从正在运行的进程中生成核心文件 但我不认为gdb可以基于核心文件继续执行 有没有什么方法可以转储堆 堆栈并在以
  • 从核心文件恢复程序状态

    在任何情况下 是否有可能将程序的状态恢复到生成核心文件期间的状态 我问的原因是 为了利用 gdb 执行函数等的能力 您需要有一个正在运行的实例 当然应该可以生成同一可执行文件的模拟进程 并将状态设置为核心的内容 如果不是 对于最初让我想要这
  • 如何自动运行 ulimit -c unlimited

    我正在尝试从我的rootfs提供对coredump文件生成的支持 我已经使用 ulimit c unlimited 命令和 hard core 1 修改了 etc limits文件 现在当我给出kill 6 时 期望生成核心文件 但要获取此
  • Linux 核心转储太大!

    最近 我注意到应用程序生成的核心转储的大小有所增加 最初 它们的大小约为 5MB 包含大约 5 个堆栈帧 现在我的核心转储超过 2GB 其中包含的信息与较小的转储没有什么不同 有什么方法可以控制生成的核心转储的大小吗 它们不应该至少小于应用

随机推荐

  • Ardupilot前馈及平滑函数input_euler_angle_roll_pitch_yaw解析

    Ardupilot前馈及平滑函数input euler angle roll pitch yaw解析 源码解析这个函数做了什么部分细节euler accel limit input shaping angle 姿态变化率与机体角速度之间的关
  • Ardupilot倾转分离函数thrust_heading_rotation_angles

    Ardupilot倾转分离函数thrust heading rotation angles 什么是轴角分离源码分析一些细节补充效果显示及进一步修改 本文主要写一下自己对于APM倾转分离 xff08 轴角分离 xff09 函数的一些学习笔记及
  • Spring IOC原理解析

    首先恭喜守宏同学找到了自己心仪的工作 xff0c 入职的事情终于尘埃落定 xff0c 也算是一个新的开始吧 和守宏聊天的时候也说了很多有关工作的事情 xff0c 畅想了以后美好的未来 xff0c 也想到了今后的种种困难 不说别的就是单单在北
  • Ardupilot四元数姿态控制函数attitude_controller_run_quat解析

    Ardupilot四元数姿态控制函数attitude controller run quat解析 源码解析细节讲解thrust heading rotation angles update ang vel target from att e
  • Ardupilot速率控制器rate_controller_run解析

    Ardupilot速率控制器rate controller run解析 PID速率控制器源码解析rate controller run PID运算积分限制update i get ff set xxx 内容补充 xff1a 函数中陀螺仪数据
  • muduo网络库学习总结:基本架构及流程分析

    muduo网络库学习 xff1a 基本架构及流程分析 基本架构Basic ReactorMutiple Reactor 43 ThreadPool muduo库的基本使用基本结构介绍EventLoop类Poller类Channel类TcpC
  • push_back和emplace_back比较以及vector扩容

    push back和emplace back比较以及vector扩容 push back和emplace back的比较使用测试类测试过程将实体类对象传入将右值数字传入将实体类对象move 转右值之后传入 vector扩容过程 关于这部分内
  • 在ubuntu 11.04下编写驱动程序

    在ubuntu11 04下直接就可以编写驱动程序 xff0c 并进行编译 hello c include 34 linux init h 34 include 34 linux module h 34 static int hello in
  • ROS的优势与不足(除了ROS 机器人自主定位导航还能怎么做?)

    导读 xff1a 随着这两年国内机器人的升温 xff0c 自主定位导航技术作为机器人智能化的第一步正不断引起行业内的重视 为了实现这一功能 xff0c 不少厂家选择采用机器人操作系统ROS xff08 Robot Operation Sys
  • C++版本发展史

    1 C 43 43 98 2 C 43 43 03 3 C 43 43 11 3 1 nullptr 3 2 auto 3 3 decltype 3 4 初始化列表 3 5 范围for循环 3 6 右值引用 3 7 字符串字面量 3 8 n
  • 分布式数据库难题(三):数据一致性

    1 什么是数据一致性 一直以来 xff0c 在 分布式系统 和 数据库 这两个学科中 xff0c 一致性 xff08 Consistency xff09 都是重要概念 xff0c 但它表达的内容却并不相同 对于分布式系统而言 xff0c 一
  • 分布式数据库难题(四):单机事务

    1 ACID的含义 在数据库中 xff0c 事务 是由多个操作构成的序列 1970 年詹姆斯 格雷 xff08 Jim Gray xff09 提出了事务的 ACID 四大特性 xff0c 将广义上的事务一致性具化到了原子性 一致性 隔离性和
  • 对一个整数进行因式分解,求出所有质因数

    1 题目描述 给定一个正整数N xff0c 对N进行质因数分解 xff0c 求解N的所有质因数 2 解题思路 xff08 1 xff09 2 是很特殊的 xff0c 必须单独列出 xff08 2 xff09 必须先判断是否质数 因为如果是质
  • Windows10下安装Ubuntu18.04LTS详细教程

    这篇文章分享自己在Windows10系统下安装VMware虚拟机 xff0c 然后在VMware中安装Ubuntu 18 04 LTS的详细过程 之所以选择在虚拟机中安装Ubuntu xff0c 主要是可以不影响自己电脑的正常使用 xff0
  • 我的2011 写给小白

    许久前就想写这篇日志了 xff0c 但是一直以各种理由搪塞着 xff0c 没空闲 xff0c 再加上该死的期末考试 xff0c 唉 xff0c 真是愁煞人也 xff0c 现在好了 xff0c 什么都完事了 xff0c 也淡定了 xff0c
  • Pixhawk的历史

    发展历程 xff1a APM gt PX4FMU IO gt Pixhawk xff1a 1 Arduino简介 Arduino就是主要以以AVR单片机为核心控制器的单片机应用开发板 xff08 当然也有其他核心的例如STM32版本的但是不
  • 姿态解算基础:欧拉角、方向余弦、四元数

    什么是姿态解算 xff1a 飞行器的姿态解算过程涉及到两个坐标系 xff0c 一个是运载体的机体坐标系 xff0c 该坐标系与运载体固连 xff0c 当运载体转动的时候 xff0c 这个坐标系也跟着转动 xff0c 我们假设运载体的坐标系为
  • 姿态解算进阶:互补滤波(陀螺仪、加速度计、地磁计数据融合)

    互补滤波原理 xff1a 在四轴入门理论知识那节我们说 xff0c 加速度计和磁传感器都是极易受外部干扰的传感器 xff0c 都只能得到2维的角度关系 xff0c 但是测量值随时间的变化相对较小 xff0c 结合加速度计和磁传感器可以得到3
  • C++实现线程池

    本文转载自 xff1a https blog csdn net caoshangpa article details 80374651 1 为什么需要线程池技术 目前的大多数网络服务器 xff0c 包括Web服务器 Email服务器以及数据
  • 详解coredump

    1 什么是coredump xff1a 2 开启或关闭core文件的生成 xff1a 3 core文件的存储位置和文件名 xff1a 4 造成程序core的原因 xff08 参考 xff09 xff1a 5 用GDB调试coredump x