当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”)。我们可以认为 core dump 是“内存快照”,但实际上,除了内存信息之外,还有些关键的程序运行状态也会同时 dump 下来,例如寄存器信息(包括程序指针、栈指针等)、内存管理信息、其他处理器和操作系统状态和信息。core dump 对于编程人员诊断和调试程序是非常有帮助的,因为对于有些程序错误是很难重现的,例如指针异常,而 core dump 文件可以再现程序出错时的情景。
上面说当程序运行过程中
异常终止或
崩溃时会发生 core dump,但还没说到什么具体的情景程序会发生异常终止或崩溃,例如我们使用
kill
-9
命令杀死一个进程会发生 core dump 吗?实验证明是不能的,那么什么情况会产生呢?
Linux 中信号是一种异步事件处理的机制,每种信号对应有其默认的操作,默认操作主要包括忽略该信号(Ingore)、暂停进程(Stop)、终止进程(Terminate)、终止并发生core dump(core)等。如果我们信号均是采用默认操作,那么,以下列出几种信号,它们在发生时会产生 core dump:
Signal |
Action |
Comment |
SIGQUIT
Core
Quit from keyboard
SIGILL
Core
Illegal Instruction
SIGABRT
Core
Abort signal from
abort
SIGSEGV
Core
Invalid memory reference
SIGTRAP
Core
Trace/breakpoint trap
当然不仅限于上面的几种信号。这就是为什么我们使用
Ctrl+z
来挂起一个进程或者
Ctrl+C
结束一个进程均不会产生
core dump,因为前者会向进程发出
SIGTSTP 信号,该信号的默认操作为暂停进程(Stop Process);后者会向进程发出
SIGINT 信号,该信号默认操作为终止进程(Terminate Process)。同样上面提到的
kill
-9
命令会发出
SIGKILL 命令,该命令默认为终止进程。而如果我们使用
Ctrl+
来终止一个进程,会向进程发出
SIGQUIT 信号,默认是会产生
core dump 的。还有其它情景会产生 core dump, 如:程序调用
abort()
函数、访存错误、非法指令等等。
Linux下打开Core Dump
Ubuntu 13.04,设置生成 core dump 文件的方法如下:
-
打开 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:
- #
- #
-
-
- * soft core unlimited
修改 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-时间戳”。