【Linux】为什么程序崩溃没有产生 coredump 文件? | 您所在的位置:网站首页 › linux系统崩溃如何拷贝数据文件 › 【Linux】为什么程序崩溃没有产生 coredump 文件? |
【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 文件默认的存储位置与对应的可执行程序在同一目录下,文件名是 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 实验室设备网 版权所有 |