【Linux】为什么程序崩溃没有产生 coredump 文件? 您所在的位置:网站首页 linux系统崩溃如何拷贝数据文件 【Linux】为什么程序崩溃没有产生 coredump 文件?

【Linux】为什么程序崩溃没有产生 coredump 文件?

2023-09-23 17:06| 来源: 网络整理| 查看: 265

【Linux】为什么程序崩溃没有产生 coredump 文件?

文章目录 【Linux】为什么程序崩溃没有产生 coredump 文件?一、现象二、什么是 coredump?三、coredump 原理四、coredump 文件的存储位置五、产生 coredump 文件的一些条件六、coredump 产生的集中可能情况七、解决方案

一、现象

  先看一下代码:

#include #include #include #include #include int main() { pid_t pid = fork(); if(pid //子进程 int * p = NULL; *p = 20; //解引用空指针,这里会出错 while(1) { printf("i am child pid=[%d] ppid=[%d]\n",getpid(),getppid()); sleep(1); } } else { //父进程pid > 0 printf("begin ---> i am father pid=[%d] ppid=[%d]\n",getpid(),getppid()); int status; wait(& status); //父进程在等待子进程的退出 printf("sig_code : %d\n",status & 0x7F); //获取进程终止信号 printf("coredump_code:%d\n",(status >> 7) & 0x1); //获取 coredump 标志位 //父进程应该在等待,等待子进程退出,退出后才会进入下面这个循环 while(1) { printf("end ---> i am father pid=[%d] ppid=[%d]\n",getpid(),getppid()); sleep(1); } } return 0; }

  fork 创建子进程,在子进程进行了解引用空指针,这里是肯定会异常退出的,父进程在 wait 等待,等待子进程的退出,获取它的终止信号和 coredump 标志位。

在这里插入图片描述

  从运行的结果可以看到,它的终止信号是 11 号信号 SIGSEGV, coredump 标志位为 0 ?为什么没有产生 coredump 文件呢?

二、什么是 coredump?

  我们经常听到大家说到程序 core 掉了,需要定位解决,这里说的大部分是指对应程序由于各种异常或者 bug 导致在运行过程中异常退出或者中止,并且会产生一个叫做 core 的文件。

  通常情况下,core 文件会包含了 程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息 等,理解为是程序工作当前状态存储生成第一个文件,许多的程序出错的时候都会产生一个 core 文件,通过工具分析这个文件,我们可以定位到程序异常退出的时候对应的堆栈调用等信息,找出问题所在并进行及时解决。

三、coredump 原理

  当程序发生内存越界访问、解引用空指针、double free 等等行为时,会触发操作系统的保护机制,此时操作系统会产生一个信号 (signal) 发送给对应的进程。当进程从内核态到用户态切换时,该进程会处理这个信号。此类信号(比如 SIGSEGV 11 号信号)的默认处理行为生成一个 coredump 文件。

在这里插入图片描述

四、coredump 文件的存储位置

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

cat /proc/sys/kernel/core_pattern

  注意: 这里是指在进程当前工作目录的下创建。通常与程序在相同的路径下。但如果程序中调用了 chdir 函数,则有可能改变了当前工作目录。这时 coredump 文件创建在 chdir 指定的路径下。

五、产生 coredump 文件的一些条件

  (1) 首先需要确认当前会话的 ulimit –c,若为 0,则不会产生对应的 coredump。我上面遇到的问题就是这个原因。

ulimit -c unlimited //可以产生 coredump 且不受大小限制 ulimit –c [size] //可以产生小于 size 大小的 coredump 文件

  注意: 这里的 size 的单位是 blocks ,一般 1 block = 512 bytes

  (2) 在 /etc/profile 中加入以下一行,这将允许生成 coredump 文件。

ulimit -c unlimited

  (3) 在 rc.local 中加入以下一行,这将使程序崩溃时生成的 coredump 文件位于 /data/coredump/ 目录下。

echo /data/coredump/core.%e.%p> /proc/sys/kernel/core_pattern

  注意: rc.local 在不同的环境,存储的目录可能不同,susu 下可能在 /etc/rc.d/rc.local 。

六、coredump 产生的集中可能情况

  (1) 内存访问越界

   ● 由于使用错误的下标,导致数组访问越界。

   ● 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符。

   ● 使用strcpy, strcat, sprintf, strcmp,strcasecmp等字符串操作函数,将目标字符串读/写满了。应该使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函数防止读写越界。

  (2) 非法指针

   ● 空指针解引用

   ● 非法的指针转化

   ● use after free

   ● double free

  (3) 堆栈

   ● 栈变量的非法写入,导致程序调用栈被破坏无法回溯

   ● 不要使用大的局部变量(因为局部变量都分配在栈上),这样容易造成堆栈溢出,破坏系统的栈和堆结构。

  (4) 多线程数据

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

七、解决方案

在这里插入图片描述



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有