纸上得来终觉浅,绝知此事要躬行。
- 陆游 《冬夜读书示子聿》

core文件调试教程

2026-04-18 18:44 · 使用教程 · 6 minutes read

什么是 core 文件

当进程被某些信号终止后,会产生一个包含进程终止时的内存映像的文件,这个文件叫做 core 文件,中文名叫核心转储文件。这个文件可以被调试器(如GDB)使用,用来查看进程终止时的状态。

以下是常见的会产生 core 文件的信号

信号名 编号 含义 是否常见 典型触发场景
SIGSEGV 11 段错误 ⭐⭐⭐⭐⭐ 空指针、野指针、越界访问、use-after-free
SIGABRT 6 程序主动中止 ⭐⭐⭐⭐ assert 失败、abort()、double free
SIGFPE 8 算术异常 ⭐⭐⭐ 除 0、浮点异常
SIGILL 4 非法指令 ⭐⭐⭐ 函数指针错误、执行非法内存
SIGBUS 7 总线错误 ⭐⭐⭐ mmap 越界、未对齐访问

ulimit 设置

1ulimit -a // 查看是否限制core文件生成

执行结果如下

 1real-time non-blocking time  (microseconds, -R) unlimited
 2core file size              (blocks, -c) 0
 3data seg size               (kbytes, -d) unlimited
 4scheduling priority                 (-e) 0
 5file size                   (blocks, -f) unlimited
 6pending signals                     (-i) 14341
 7max locked memory           (kbytes, -l) 64
 8max memory size             (kbytes, -m) unlimited
 9open files                          (-n) 1024
10pipe size                (512 bytes, -p) 8
11POSIX message queues         (bytes, -q) 819200
12real-time priority                  (-r) 0
13stack size                  (kbytes, -s) 8192
14cpu time                   (seconds, -t) unlimited
15max user processes                  (-u) 14341
16virtual memory              (kbytes, -v) unlimited
17file locks                          (-x) unlimited

当 core file size 为0 时, 不会生成 core 文件,使用如下命令改变 core file size。

1ulimit -c unlimited // unlimited 意思为不限制,也可以用数字指定大小,单位是 block (512字节)

kernel.core_pattern 设置

当进程因为 致命信号(如 SIGSEGVSIGABRT)崩溃时,内核会:

  1. 检查 RLIMIT_CORE(即 ulimit -c

  2. 若允许生成 core

  3. kernel.core_pattern 指定的规则

    生成 core 文件将 core 通过管道交给用户态程序处理

因此它决定了两件事:

查看当前设置

1cat /proc/sys/kernel/core_pattern 

或者

1sysctl kernel.core_pattern

常见输出示例:

1core

或:(后面说明这种方式,这种方式是交由了systemd-coredump 进程处理)

1|/usr/lib/systemd/systemd-coredump%P%u%g%s%t%c%h%e

临时更改设置

  1. 使用 sysctl
1sudo sysctl -w kernel.core_pattern=core

或:

1sudo sysctl -w kernel.core_pattern=/tmp/core.%e.%p
  1. 直接写 /proc
1echo"/tmp/core.%e.%p" >> /proc/sys/kernel/core_pattern

永久更改设置

编辑:

1sudo vim /etc/sysctl.conf

或创建单独配置文件(更规范):

1sudo vim /etc/sysctl.d/99-core.conf

写入:

1kernel.core_pattern=/tmp/core.%e.%p

使其生效:

1sudo sysctl -p # 或
2sudo sysctl --system

core_pattern 占位符(语义化命名)

占位符 含义
%e 可执行文件名
%p 进程 PID
%u 用户 UID
%g 用户 GID
%s 导致 core 的信号编号
%t 崩溃时间(epoch 秒)
%h 主机名
%c core 文件大小限制

“管道模式”

如果 core_pattern | 开头,表示:

不生成 core 文件,而是把 core dump 通过管道传给一个用户态程序

典型例子(现代发行版默认):

1|/usr/lib/systemd/systemd-coredump%P%u%g%s%t%c%h%e

这意味着:

systemd-coredump 相关操作

查看 core 列表

1coredumpctl list

调试某个 core

1coredumpctl gdb <PID>

导出 core 文件

1coredumpctl dump <PID> > core.dump

调试 core 文件

systemd-coredump 管理的 core 文件

见上述systemd-coredump 相关操作

普通 core 文件

1gdb <可执行文件> <core文件>

运行后到达崩溃处,然后bt,frame调试即可。


🌙