什么是 core dump
core dump 是一个进程的内存瞬时映像. core dump 这个名字来自于最早的计算机的内存技术. 使用 gdb 等工具可以读取 core dump, 然后分析进程当时的运行状态和内存信息.
https://man7.org/linux/man-pages/man5/core.5.html
如何获得 core dump
- 给进程发各种能产生 core dump 的 signal, 比如 SIGQUIT, SIGKILL 等.
- 使用 gdb 等 debug 工具对正在运行的进程发送 signal, 产生 core dump.
由于 1) core dump 会占用大量的磁盘空间, 2) core dump 可能包含内存的里面某些敏感数据, 所以 Linux 尽管在得到要 trigger core dump 的信号情况下, 也由于 ulimit 的控制, 默认不产生 core dump. 因此, 如果要捕获 core dump, 首先要选择打开 core dump limit 设置.
使用 ulimit -a 命令查看当前 ulimit 设置值:
eric@host:~$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 31660
max locked memory (kbytes, -l) 16384
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 31660
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
修改 ulimit 设置
可以使用 ulimit -c unlimited 命令, 但是可能非 root 用户没有权限.
在 /etc/security/ 目录下, 有个 limits.conf 和 limits.d 目录(如果有 limits.d 则 limits.conf 不生效, 可以认为 limits.conf 是模板). 在 limits.d 目录下新建一个以 .conf 结尾的文本文件, 添加要改的一行.
eric@host:~$ ls /etc/security/ | grep limit
limits.conf
limits.d
core dump 的文件名
正常情况下 core dump 的文件名没有后缀, 文件名就是 core. 这个名字可以通过 /proc/sys/kernel/core_pattern 来改. 这个名字还可以使用一些模板字符来替换. 比如 %h: 主机名; %p: 进程号 %t: Epoch 毫秒数, %u: user id;
如何分析 core dump