设为首页 加入收藏

TOP

Linux Core Dump
2015-02-02 14:36:58 来源: 作者: 【 】 浏览:8
Tags:Linux Core Dump

当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”)。我们可以认为 core dump 是“内存快照”,但实际上,除了内存信息之外,还有些关键的程序运行状态也会同时 dump 下来,例如寄存器信息(包括程序指针、栈指针等)、内存管理信息、其他处理器和操作系统状态和信息。core dump 对于编程人员诊断和调试程序是非常有帮助的,因为对于有些程序错误是很难重现的,例如指针异常,而 core dump 文件可以再现程序出错时的情景。


在半导体作为电脑内存材料之前,电脑内存使用的是?磁芯内存(Magnetic Core Memory),Core Dump 中的 Core 沿用了磁芯内存的?Core?表达。图为磁芯内存的一个单元,来自?Wikipedia.



在?APUE?一书中作者有句话这样写的:


这里的 core 就是沿用的是早期电脑磁芯内存中的表达,也能看出 Unix 系统 Core Dump 机制的悠久历史。由此我们也能知道其实将"core dump"翻译称"核心转储"并不太准备, 翻译成"内存转储"更恰当一些.


Dump?指的是拷贝一种存储介质中的部分内容到另一个存储介质,或者将内容打印、显示或者其它输出设备。dump 出来的内容是格式化的,可以使用一些工具来解析它。


现代操作系统中,用?Core Dump?表示当程序异常终止或崩溃时,将进程此时的内存中的内容拷贝到磁盘文件中存储,以方便编程人员调试。


上面说当程序运行过程中异常终止崩溃时会发生 core dump,但还没说到什么具体的情景程序会发生异常终止或崩溃,例如我们使用?kill -9?命令杀死一个进程会发生 core dump 吗?实验证明是不能的,那么什么情况会产生呢?


Linux 中信号是一种异步事件处理的机制,每种信号对应有其默认的操作,你可以在?这里?查看 Linux 系统提供的信号以及默认处理。默认操作主要包括忽略该信号(Ingore)、暂停进程(Stop)、终止进程(Terminate)、终止并发生core dump(core)等。如果我们信号均是采用默认操作,那么,以下列出几种信号,它们在发生时会产生 core dump:


当然不仅限于上面的几种信号。这就是为什么我们使用?Ctrl+z?来挂起一个进程或者?Ctrl+C?结束一个进程均不会产生 core dump,因为前者会向进程发出?SIGTSTP?信号,该信号的默认操作为暂停进程(Stop Process);后者会向进程发出SIGINT?信号,该信号默认操作为终止进程(Terminate Process)。同样上面提到的?kill -9?命令会发出?SIGKILL?命令,该命令默认为终止进程。而如果我们使用?Ctrl+\?来终止一个进程,会向进程发出?SIGQUIT?信号,默认是会产生 core dump 的。还有其它情景会产生 core dump, 如:程序调用?abort()?函数、访存错误、非法指令等等。


下面举两个例子来说明:


?


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Linux Kernel代码艺术——数组初.. 下一篇Linux Kernel代码艺术——系统调..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: