生成 core dump 文件
如果进程在运行期间发生奔溃,操作系统会为进程生成一个快照文件,这个文件就叫做 core dump。之后我们可以对 core dump 文件进行分析,弄清楚进程为什么会奔溃。
由于 core dump 文件会占据一定的磁盘空间,默认情况下,Linux 不允许生成 core dump 文件。例如,下面的命令显示,Linux 允许的最大 core dump 文件大小为 0:
可以通过下面设置,允许 Linux 生成 core dump 文件:
注意到,这个设置只对当前登录回话有效。如果想要这个设置持久有效,可以把它写入到/etc/security/limits.conf
文件中:
core dump 文件的路径
那么 core dump 会存放在哪个目录呢?这是由系统参数kernel.core_pattern
决定的。例如,在 Ubuntu 16.04 中,它的值如下:
开头的I
表示,core dump 文件会交给 apport 程序去处理,而 apport 会将 core dump 文件保存在/var/crash
目录下。
在实践中,更好的做法是自己指定 core dump 目录,以及 core dump 文件的命名方式:
我们设置 core dump 目录为/var/crash
,core dump 的命名方式为%E.%p.%t.%s
,它们的含义:
%E
:程序文件的完整路径(路径中的/
会被!
替代)%p
:进程 ID%t
:进程奔溃的时间戳%s
:哪个信号让进程奔溃
下面是一个简单的 C++ 程序,我们用它来演示如何生成 core dump 文件:
这个文件的路径是/home/ubuntu/main.cpp
,编译并运行这个程序:
可以看到,进程 ID 是32453
,只要杀死这个进程,就可以看到生成了 core dump 文件: