core dump 是什么?怎么开启、怎么用 gdb 分析
答案:core dump 是程序崩溃时内核转储的进程内存快照(含调用栈/寄存器/内存)。用 ulimit -c unlimited 开启,崩溃后 gdb <程序> <core> + bt 定位崩溃栈。常见原因:段错误、空指针、double free。
一、开启 core dump
# 临时开启(当前 shell 生效)
ulimit -c unlimited
# 永久开启(/etc/security/limits.conf)
# * soft core unlimited
# 查看 core 文件路径与命名(/proc/sys/kernel/core_pattern)
cat /proc/sys/kernel/core_pattern二、崩溃后分析
# 1. 确认 core 文件(名字含 core,如 core.1234)
ls core*
# 2. 用带调试符号的程序打开
gdb ./program core.1234
# 3. 看崩溃调用栈
(gdb) bt
(gdb) info registers # 看寄存器
(gdb) frame 2 # 切到第 2 帧看细节
(gdb) list # 看对应源码关键:用 -g 编译的程序才能看到源码行号;无符号的 core 只能看地址。
三、常见崩溃原因
| 信号 | 原因 |
|---|---|
| SIGSEGV (11) | 段错误:空指针/非法内存访问 |
| SIGABRT (6) | abort()/断言失败/double free 检测 |
| SIGBUS (7) | 对齐错误/无效地址 |
| SIGILL (4) | 非法指令 |
| SIGFPE (8) | 除零/溢出 |
四、文件太大怎么办(生产)
# 限制大小:<大小上限>:<core文件路径> 格式,0=禁止
sysctl kernel.core_pattern='core.%p'
# 或走 systemd-coredump 自动压缩并只保留关键信息
# 内核限制:/proc/sys/kernel/core_uses_pid、coredump_filter 控制转储段五、常见坑
- core 没生成:先查
ulimit -c,默认常为 0(禁用); - gdb 打不开 core:程序路径/版本不匹配,用原编译产物;
- 分析没意义:没
-g符号时用addr2line或保留的 build-id 匹配符号; - core 文件属于敏感数据:含内存密码等,生产注意权限与保留策略。
深度入口
- core dump 完整指南:core dump 深入
- 信号全解:信号
- 段错误调试:ASan 内存检测
- 崩溃性能影响:core dump 性能
FAQ
Q: core dump 是什么意思? A: 崩溃时内核转储的内存快照(栈/寄存器/内存),用于事后调试;默认可能禁用,ulimit -c unlimited 开启。
Q: core dumped 怎么解决? A: 开启 core → 复现崩溃拿 core → gdb 程序 core + bt 看崩溃栈 → 修崩溃点。
Q: coredump 文件怎么查看? A: gdb <程序> <core> + bt;file core、readelf -n core 看信号与来源。
Q: core dump 常见原因有哪些? A: 段错误、空指针、double free、栈溢出、越界写坏堆;信号名(SIGSEGV/SIGABRT)能缩小范围。
Q: 怎么开启 core dump? A: ulimit -c unlimited 临时;/etc/security/limits.conf 永久;路径由 core_pattern 控制。
Q: 生产环境 core 文件太大怎么办? A: core_pattern 设大小/pipe 到压缩脚本(systemd-coredump),或 coredump_filter 控制转储段。
一句话总结:core dump = 崩溃时的内存快照,ulimit -c unlimited 开启、gdb 程序 core + bt 分析;SIGSEGV/SIGABRT 是最常见信号,配 -g 符号才能看到源码行,生产上注意用 systemd-coredump 控制体积与敏感数据。