在linux中,Core是内存的意思。当程序运行过程中检测到异常程序异常退出时, 系统把程序当前的内存状况存储在一个core文件中, 叫core dumped,也就信息转储;操作系统检测到当前进程异常时将通过信号的方式通知目标进程相应的错误信息,常见的信号有SIGSEGV、SIGBUS等,默认情况下进程接收到相应的信号都有相应的处理机制。

本教程操作环境:linux7.3系统、Dell G3电脑。
在Linux下开发中,我们经常听到程序员说我的程序core掉了,通常出现这类的问题是低级bug中的内存访问越界、使用空指针、堆栈溢出等情况。使程序运行过程中异常退出或者终止,满足这些条件就会产生core的文件。
为什么会发生Coredump
Core就是内存的意思,这个词源自很早以前制造内存的材料,一直延用到现在,当程序运行过程中检测到异常程序异常退出时, 系统把程序当前的内存状况存储在一个core文件中, 叫core dumped,也就信息转储,操作系统检测到当前进程异常时将通过信号的方式通知目标进程相应的错误信息,常见的信号有SIGSEGV,SIGBUS等,默认情况下进程接收到相应的信号都有相应的处理机制。
以Linux为例,Action则对应信号的处理方式,红色框标注为常见信号

在此之前最好先了解下进程的内存布局, Unix与Linux系统的进程空间布局会稍微有点不同,内核空间会比Linux小,特别是内核与用户进程采用分离的地址空间模式,这里以Linux为例:

coredump文件的存储位置
我们知道在Linux系统中,如果进程崩溃了,系统内核会捕获到进程崩溃信息,然后将进程的coredump 信息写入到文件中,这个文件名默认是core 。存储位置与对应的可执行程序在同一目录下,文件名是core,大家可以通过下面的命令看到core文件的存在位置:

Core_pattern的格式:
%p 转储过程的PID
%u (数字)转储进程的实际UID
%G (数字)转储过程的实际GID
%s 引起转储的信号数
%t 转储时间,表示为自1970年1月1日00:00:00 +0000(UTC)以来的秒数
%H 主机名(与uname(2)返回的节点名相同)
%e 可执行文件名(无路径前缀)
%E 可执行文件的路径名,用斜杠(’/’)替换为感叹号(’!’)。
%C 崩溃过程的核心文件大小软资源限制(自Linux 2.6.24开始)
下面的程序可用于演示/ proc / sys / kernel / core_pattern文件中管道语法的用法。
#include <sys/stat.h>
#include <fcntl.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define BUF_SIZE 1024
int main(int argc, char *argv[])
{
int tot, j;
ssize_t nread;
char buf[BUF_SIZE];
FILE *fp;
char cwd[PATH_MAX];
/* 属性的当前工作目录崩溃的过程*/
snprintf(cwd, PATH_MAX, "/proc/%s/cwd", argv[1]);
chdir(cwd);
/*
.........................................................