linux, 程序崩溃后,用GDB调试器 分析 核心转储文件
“核心转储文件”(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(变量)
↓
定位根因
更多推荐

所有评论(0)