资讯动态

Linux Core Dump 分析

发布时间:2026/8/23 17:20:12 来源:尧图企业网站定制
当程序运行的过程中异常终止或崩溃操作系统会将程序当时的内存状态记录下来保存在一个文件中这种行为就叫做Core Dump中文有的翻译成“核心转储”)。我们可以认为 core dump 是“内存快照”但实际上除了内存信息之外还有些关键的程序运行状态也会同时 dump 下来例如寄存器信息包括程序指针、栈指针等、内存管理信息、其他处理器和操作系统状态和信息。core dump 对于编程人员诊断和调试程序是非常有帮助的因为对于有些程序错误是很难重现的例如指针异常而 core dump 文件可以再现程序出错时的情景。1. Core Dump 名词解释在半导体作为电脑内存材料之前电脑内存使用的是磁芯内存 (Magnetic Core Memory)Core Dump 中的 Core 沿用了磁芯内存的Core表达。图为磁芯内存的一个单元。在APUE一书中作者有句话这样写的Because the file is namedcore, it shows how long this feature has been part of the Unix System.这里的 core 就是沿用的是早期电脑磁芯内存中的表达也能看出 Unix 系统 Core Dump 机制的悠久历史。Dump指的是拷贝一种存储介质中的部分内容到另一个存储介质或者将内容打印、显示或者其它输出设备。dump 出来的内容是格式化的可以使用一些工具来解析它。现代操作系统中用Core Dump表示当程序异常终止或崩溃时将进程此时的内存中的内容拷贝到磁盘文件中存储以方便编程人员调试。2. Core Dump 如何产生上面说当程序运行过程中异常终止或崩溃时会发生 core dump但还没说到什么具体的情景程序会发生异常终止或崩溃例如我们使用kill -9命令杀死一个进程会发生 core dump 吗实验证明是不能的那么什么情况会产生呢Linux 中信号是一种异步事件处理的机制每种信号对应有其默认的操作你可以在这里查看 Linux 系统提供的信号以及默认处理。默认操作主要包括忽略该信号 (Ingore)、暂停进程 (Stop)、终止进程 (Terminate)、终止并发生 core dump (core) 等。如果我们信号均是采用默认操作那么以下列出几种信号它们在发生时会产生 core dumpSignalActionCommentSIGQUITCoreQuit from keyboardSIGILLCoreIllegal InstructionSIGABRTCoreAbort signal from abortSIGSEGVCoreInvalid memory referenceSIGTRAPCoreTrace/breakpoint trap当然不仅限于上面的几种信号。这就是为什么我们使用Ctrlz来挂起一个进程或者CtrlC结束一个进程均不会产生 core dump因为前者会向进程发出SIGTSTP信号该信号的默认操作为暂停进程 (Stop Process)后者会向进程发出SIGINT信号该信号默认操作为终止进程 (Terminate Process)。同样上面提到的kill -9命令会发出SIGKILL命令该命令默认为终止进程。而如果我们使用Ctrl\来终止一个进程会向进程发出SIGQUIT信号默认是会产生 core dump 的。还有其它情景会产生 core dump如程序调用abort()函数、访存错误、非法指令等等。下面举两个例子来说明终端下比较CtrlC和Ctrl\~$ sleep 10 #使用sleep命令休眠 10 s ^C #使用 CtrlC 终止该程序不会产生 core dump ~$ sleep 10 ^\Quit (core dumped) #使用 Ctrl\ 退出程序会产生 core dump ~$ ls #多出下面一个 core 文件 -rw------- 1 guohailin guohailin 335872 10月 22 11:31 sleep.core.21990小程序产生 core dump#include stdio.h int main() { int *null_ptr NULL; *null_ptr 10; //对空指针指向的内存区域写,会发生段错误 return 0; }#编译执行 ~$ ./a.out Segmentation fault (core dumped) ~$ ls #多出下面一个 core 文件 -rw------- 1 guohailin guohailin 200704 10月 22 11:35 a.out.core.220703. Linux 下打开 Core Dump我使用的 Linux 发行版是 Ubuntu 13.04设置生成 core dump 文件的方法如下3.1. 打开 core dump 功能在终端中输入命令ulimit -c输出的结果为 0说明默认是关闭 core dump 的即当程序异常终止时也不会生成 core dump 文件。我们可以使用命令ulimit -c unlimited来开启 core dump 功能并且不限制 core dump 文件的大小 如果需要限制文件的大小将 unlimited 改成你想生成 core 文件最大的大小注意单位为 blocks (KB)。用上面命令只会对当前的终端环境有效如果想需要永久生效可以修改文件/etc/security/limits.conf文件关于此文件的设置参看这里。增加一行:# /etc/security/limits.conf # #Each line describes a limit for a user in the form: # #domain type item value * soft core unlimited3.2.修改 core 文件保存的路径默认生成的 core 文件保存在可执行文件所在的目录下文件名就为core。通过修改/proc/sys/kernel/core_uses_pid文件可以让生成 core 文件名是否自动加上 pid 号。例如echo 1 /proc/sys/kernel/core_uses_pid生成的 core 文件名将会变成core.pid其中 pid 表示该进程的 PID。还可以通过修改/proc/sys/kernel/core_pattern来控制生成 core 文件保存的位置以及文件名格式。例如可以用echo /tmp/corefile-%e-%p-%t /proc/sys/kernel/core_pattern设置生成的 core 文件保存在 “/tmp/corefile” 目录下文件名格式为 “core-命令名-pid-时间戳”。这里有更多详细的说明4. 使用 gdb 调试 Core 文件产生了 core 文件我们该如何使用该 Core 文件进行调试呢Linux 中可以使用 GDB 来调试 core 文件步骤如下首先使用 gcc 编译源文件加上-g以增加调试信息按照上面打开 core dump 以使程序异常终止时能生成 core 文件运行程序当 core dump 之后使用命令gdb program core来查看 core 文件其中 program 为可执行程序名core 为生成的 core 文件名。下面用一个简单的例子来说明#include stdio.h int func(int *p) { int y *p; return y; } int main() { int *p NULL; return func(p); }编译加上调试信息运行之后core dump使用 gdb 查看 core 文件。~$ gcc core_demo.c -o core_demo -g ~$ ./core_demo Segmentation fault (core dumped) ~$ gdb core_demo core_demo.core.24816 ... Core was generated by ./core_demo. Program terminated with signal 11, Segmentation fault. #0 0x080483cd in func (p0x0) at core_demo.c:5 5 int y *p; (gdb) where #0 0x080483cd in func (p0x0) at core_demo.c:5 #1 0x080483ef in main () at core_demo.c:12 (gdb) info frame Stack level 0, frame at 0xffd590a4: eip 0x80483cd in func (core_demo.c:5); saved eip 0x80483ef called by frame at 0xffd590c0 source language c. Arglist at 0xffd5909c, args: p0x0 Locals at 0xffd5909c, Previous frames sp is 0xffd590a4 Saved registers: ebp at 0xffd5909c, eip at 0xffd590a0 (gdb)从上面可以看出我们可以还原 core_demo 执行时的场景并使用where可以查看当前程序调用函数栈帧还可以使用 gdb 中的命令查看寄存器变量等信息。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价