✅ 一句话回答(面试可直接用):
core dump 是程序崩溃时操作系统保存的一份内存快照文件,它记录了程序崩溃时的全部上下文(栈、寄存器、变量等),用于帮助开发者定位问题、调试崩溃。
📦 core dump 具体包含什么?
- 崩溃时 CPU 的寄存器(PC、SP、EIP…)
- 当前线程的调用栈
- 所有内存数据(堆、栈、全局变量)
- 程序指令所在的
.text
段映射信息
🧨 常见导致 core dump 的原因(也就是“程序崩了”)
错误类型 | 示例 |
---|---|
空指针解引用 | int *p = nullptr; *p = 1; |
越界访问 | 数组越界、野指针 |
栈溢出 | 死递归、不当的栈分配 |
double free | 内存释放两次 |
非法内存访问 | 访问已释放或未分配的内存 |
除以零 | int a = 1 / 0; |
🧰 怎么排查 core dump?
分 3 步:
✅ 第一步:允许系统生成 core 文件
ulimit -c unlimited # 临时开启 core dump
ulimit -a # 查看系统限制
也可以配置 core dump 文件名:
echo "/tmp/core.%e.%p" | sudo tee /proc/sys/kernel/core_pattern
✅ 第二步:程序崩溃时会在当前目录或 /tmp
生成 core
文件
如果你程序叫 my_app
,可能生成文件叫 core.my_app.12345
✅ 第三步:用 gdb 分析 core 文件
g++ -g my_app.cpp -o my_app # 编译时加 -g 生成调试符号
./my_app # 运行,假设崩了生成 core 文件
gdb ./my_app core
进入 gdb 后你可以用这些命令:
命令 | 说明 |
---|---|
bt | 查看调用堆栈(backtrace) |
info locals | 查看局部变量 |
list | 查看崩溃处源码 |
frame 0 | 进入崩溃那一帧 |
quit | 退出 gdb |
🧠 实战例子:让程序崩溃 + 分析 core
源码:
int main() {
int *p = nullptr;
*p = 42; // 崩溃点
return 0;
}
编译运行:
g++ -g crash.cpp -o crash
ulimit -c unlimited
./crash # 崩溃,生成 core 文件
gdb ./crash core
然后你会看到类似:
Program terminated with signal SIGSEGV, Segmentation fault.
#0 main () at crash.cpp:3
3 *p = 42;
这就清楚定位到了崩溃点!
✅ 面试回答模板(高质量):
core dump 是程序崩溃时生成的内存快照,可以用 gdb 等工具分析,帮助定位崩溃原因。通过
ulimit
启用 core 文件后,结合gdb ./程序 core
可以查看调用栈、变量值和崩溃行,常用于调试空指针、越界、内存访问错误等问题。