Author:onceday date:2022年8月1日
当进程收到某些信号时,默认的信号处理函数在终止进程之前会对进程的内存映像进行存储,形成当前时刻的“快照”,这个“快照”就是Core dumped。
会记录下内存信息,寄存器信息,内存管理信息,其他处理器和操作系统的状态和信息。
Linux默认是关闭了core dump功能,需要手动打开。
使用以下指令查询core dump 状态:
ulimit -c #返回0,代表关闭了core dump功能
可以使用以下命令在当前终端环境生效core dump:
ulimit -c unlimited
这开启了core dump功能,而且还没有限制文件大小,可以将unlimited改成合适的大小,单位为blocks(KB)。
永久开启core dump功能,可修改配置文件/etc/security/limits.conf
# /etc/security/limits.conf
#
#- can be one of the following:
# - core - limits the core file size (KB)
#
# -
#* soft core 0
该文件也可以修改其他的内容。
修改存储的位置:
$ cat /proc/sys/kernel/core_pattern
|/usr/share/apport/apport ......
默认将数据通过一个管道传输到python脚本输出,因此不会输出core dump文件。
更改该命令必须通过以下命令执行:
sudo bash -c "echo core > /proc/sys/kernel/core_pattern"
通过编辑器或其他途径都有失败的可能,如果无法生成转储文件,务必使用该方法生成,该文件。
如果不给定目录,那么默认为当前程序运行目录。
其可具有以下参数:
%%,单个%号字符
%p,所dump进程的进程ID
%u,所dump的实际用户ID
%g,所dump进程的实际组ID
%s,导致本次coredump的信号
%t,coredump的时间戳
%e,程序文件名
也可以通过修改/etc/systcl.conf文件,添加coredump对应目录及格式,此处user为用户名对应目录。
/home/user/coredump/core.%e.%p.%s.%E
然后输入以下命令使其生效:
sudo sysctl -p /etc/sysctl.conf
可以使用以下命令进行测试:
kill -s SIGSEGV $$ #杀死当前的shell进程
可能是没有解开系统限制:
ulimit -a #查看系统限制
ulimit -c unlimited #解除系统限制
下面四个权限和空间不足的例子:
程序设置了用户id(调用了setuid),当当前用户并非该程序文件的所有者。
程序设置了组id(即调用segid),当当前用户并非该程序文件的组所有者。
用户没有当前目录或指定core文件产生目录的写权限。
core文件太大,磁盘空间不足。
直接输入命令:
gdb 可执行程序 核心转储文件
然后再使用bt和where查看堆栈错误信息。
具体的gdb使用请查看专门文档!