
#include
using namespace std;
int main(int argc,char *argv[])
{
int *a = NULL;
*a = 0x1;
return 0;
}
cmake_minimum_required(VERSION 3.10)
project(main)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -Wall")
INCLUDE_DIRECTORIES(./)
AUX_SOURCE_DIRECTORY(./ MAIN)
add_executable(main ${MAIN})
大多数Linux发行版本默认关闭内核转储功能
ulimit -a // 查看设置效果

ulimit -c
-c 表示内核转储文件的大小限制, 限制为0, 内核转储无效

ulimit -c unlimited // 不限制内核转储文件的大小,只是临时生效

ulimit -c 1073741824 // 设置core上限大小
永久生效需要在shell的启动脚本/etc/bashrc、~/.bashrc或者/etc/profile等地方写入
echo “ulimit -c unlimited” >> /etc/profile

/proc/sys/kernel目录下看当前core的配置, /proc这个目录是一个虚拟文件系统,它放置的数据都是在内存中,本身不占有磁盘空间,vi不能直接修改


kernel.core_pattern需要没配置, 或者就是core

kernel.core_uses_pid = 1
1:添加pid作为扩展名,生成的core文件名称为core.pid
0:不添加pid作为扩展名,生成的core文件名称为core

修改/etc/sysctl.conf
kernel.core_pattern = /var/lib/systemd/coredump/%t-%e-%p-%c
kernel.core_uses_pid = 0 // 设置什么都不生效

运行sysctl -p让新增设置生效, 再运行./main

| 格式符 | 说明 |
|---|---|
| %% | %字符本身 |
| %p | 被转储进程的进程ID(PID) |
| %u | 被转储进程的真实用户ID (real UID) |
| %g | 被转储进程的真实组ID(real GID) |
| %s | 引发转储的信号编号 |
| %t | 转储时刻(从1970年1月1日 0:00 开始的秒数) |
| %h | 主机名 |
| %e | 可执行文件名 |
| %c | 转储文件的大小上限(内核版本2.6.24以后可以使用) |
#!/bin/sh
exec gzip -> /var/lib/systemd/coredump/$1-$2-$3-$4.core.gz

kernel.core_pattern可以加入管道符, 启动用户模式辅助程序
管道符(|) 后面可以写程序名
kernel.core_pattern = |/usr/local/sbin/core_helper %t %e %p %c

