在 Linux C 编程中,core 通常指的是 Core Dump(核心转储文件)。
当程序发生严重错误(如段错误 Segmentation Fault、非法指令、除零错误等)而崩溃时,Linux 内核会将该进程当时的内存状态、寄存器信息、堆栈跟踪等数据保存到磁盘上的一个文件中,这个文件就是 Core Dump 文件。
Core Dump 的作用
- 调试崩溃程序:通过
gdb等工具分析 core 文件,定位崩溃原因。 - 记录运行时状态:包括变量值、调用栈、内存布局等。
- 生产环境排查问题:尤其在无法复现的偶发 bug 中非常有用。
如何生成 Core Dump
检查当前是否允许生成 Core Dump
ulimit -c
- 如果输出为
0,表示禁止生成 core 文件。 - 如果输出为非零数字(如
1024),表示允许生成,且限制大小为 1024 KB。
启用 Core Dump
ulimit -c unlimited # 允许生成无大小限制的 core 文件
注意:
ulimit设置只对当前 shell 及其子进程有效,如需永久生效,可写入/etc/security/limits.conf或/etc/profile。
指定 Core 文件生成路径和名称
通过 /proc/sys/kernel/core_pattern 控制:
cat /proc/sys/kernel/core_pattern # 默认可能是: core # 可修改为: /tmp/core.%e.%p (%e 是程序名,%p 是 PID)
修改方法:
echo "/tmp/core.%e.%p" | sudo tee /proc/sys/kernel/core_pattern
常用占位符:
%e:可执行文件名%p:进程 PID%t:时间戳%u:用户 ID%g:组 ID
触发 Core Dump 的常见信号
以下信号会导致程序崩溃并生成 core dump(如果未捕获):
| 信号 | 含义 |
|---|---|
SIGSEGV |
段错误(访问非法内存) |
SIGABRT |
主动 abort(如
失败) |
SIGFPE | 浮点异常(如除零) |
SIGILL | 非法指令 |
SIGBUS | 总线错误(如访问未对齐内存) |
使用 GDB 分析 Core 文件
假设你有一个可执行文件 myapp 和一个 core 文件 core.myapp.12345:
gdb ./myapp core.myapp.12345
进入 GDB 后常用命令:
(gdb) bt # 查看调用栈 (gdb) frame 3 # 切换到第3层栈帧 (gdb) print var # 打印变量值 (gdb) list # 查看源码 (gdb) info registers # 查看寄存器状态
C 程序中手动触发 Core Dump
你可以用 abort() 或 raise(SIGSEGV) 手动触发:
#include <stdlib.h>
#include <signal.h>
int main() {
abort(); // 发送 SIGABRT,生成 core dump
// 或 raise(SIGSEGV);
return 0;
}
注意事项
- 权限问题:确保程序有权限写入 core 文件目录。
- 磁盘空间:确保目标分区有足够空间。
- ASLR(地址空间布局随机化):可能影响 core 文件分析,调试时可临时关闭:
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
- 压缩 Core 文件:可通过
core_pattern指定压缩工具,如:echo "|/usr/bin/gzip -c > /tmp/core.%e.%p.gz" | sudo tee /proc/sys/kernel/core_pattern
示例:完整调试流程
编写一个会段错误的程序:
// crash.c
#include <stdio.h>
int main() {
int p = NULL;
p = 42; // 段错误
return 0;
}
编译:
gcc -g -o crash crash.c
启用 core dump:
ulimit -c unlimited
-
运行程序,触发崩溃,生成 core 文件。
-
用 GDB 分析:
gdb ./core.crash.<PID>
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/477527.html



