核心转储文件”(core dump),可以理解成:程序崩溃瞬间的一张“内存快照”+现场记录。

当进程因为异常(比如 abort() 触发的 SIGABRT)终止时,操作系统会把 进程当时的内存状态、寄存器信息等保存到一个文件里,这个文件就是核心转储文件(core file)。

核心转储文件里有什么?

它本质上是一个二进制文件,通常包含:

  •  进程的虚拟内存内容
    • 栈(stack)
    • 堆(heap)
    • 全局变量区
  •  CPU寄存器状态
    • 程序计数器(PC)
    • 栈指针(SP)
  •  线程信息
  •  加载的库(如 libc)信息
  •  崩溃原因(信号,比如 SIGABRT、SIGSEGV)

实战练习:人为制造程序崩溃 → 生成 core → 用 GDB 分析:

第一步:写一个“必崩”的程序,故意制造一个 野指针崩溃(SIGSEGV)

#include <stdio.h>

void crash() {
    int *p = NULL;
    *p = 123;   // 空指针写 → 人为制造崩溃
}

int main() {
    printf("start\n");
    crash();
    printf("end\n");
    return 0;
}

开启 core dump:

默认系统可能不生成 core 文件,先打开:

ulimit -c unlimited

ulimit -c   如果显示 unlimited 就OK。

把系统改回“原始 core dump 模式”

方法一:临时关闭(推荐先用这个)
sudo systemctl stop apport
然后:echo core | sudo tee /proc/sys/kernel/core_pattern

方法二:永久关闭 

sudo vim /etc/default/apport

修改为 enabled=0

现在开始,测试写好的程序:段错误,生成核心转储文件 core.4444 或者 core 

执行 gdb ./test core.4444

通过 GDB 已经得到:

Program terminated with signal SIGSEGV  访问非法内存(段错误)

执行 (gdb) bt 

显示 :

#0  crash () at test.c:5       (第5行,在crash 函数里)
#1  main () at test.c:10      (第10行 , mian 函数里)

main() 调用了 crash()

crash() 第 5 行挂了

main → crash → 崩溃

打印 p , 显示 p == NULL ,等价于 *(0x0) = 123; 

地址 0x0 是非法访问(用户态不可访问)

CPU 触发异常 → 内核发 SIGSEGV

标准工业级调试流程

core  核心转储文件
   ↓
gdb 加载
   ↓
bt(调用栈)
   ↓
list(代码)
   ↓
print(变量)
   ↓
定位根因

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐