24

关于程序崩溃生成core文件的一些配置

 4 years ago
source link: http://www.pengrl.com/p/20045/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

linux下,程序异常结束,会生成一个core dump文件,这个文件包含了进程结束时的一些快照信息。

使用gdb等调试工具,可以调试这个core文件,分析崩溃原因。

生成core文件的开关

使用如下命令,查看生成core文件的开关是否打开:

$ulimit -c
0

如上输出0,表示没有打开。如果程序发生段错误崩溃,控制台输出如下:

Segmentation fault

使用如下命令,打开开关:

$ulimit -c unlimited

再次查看开关的状态:

$ulimit -c
unlimited

程序崩溃后控制台输出如下:

Segmentation fault (core dumped)

并在硬盘上生成一个core文件。

另外插一嘴, ulimit -c 除了可以设置为 ulimited ,实际上还可以设置为数字,用于限制core文件的大小,当core文件超出限制的大小,将被剪裁存储。

但是比较迷的是它使用的单位是 block ,1个block是多大,可以参考下《 这篇文章 》。

按它的意思,要么是512字节,要么是1024字节。

我在一台centos机器测试了一下,设置为10时( ulimit -c 10 ),生成的core文件大小为12288,设置为20时,大小为20480。

生效范围

设置 ulimit -c 和export设置环境变量是一样的,只对当前终端有效。可以在每次启动进程前进行设置,或者将设置加入 /etc/profile~/.bashrc 等初始化配置文件中。

core文件名和存储路径

一共有两个设置,使用如下方式查看:

$cat /proc/sys/kernel/core_uses_pid
0
$cat /proc/sys/kernel/core_pattern
core

如上最简单的配置时,生成的core文件,文件名就是 core ,存储路径为执行程序时的路径。

由于文件名是固定的,新生成的core文件会将老的core文件覆盖。

文件名加上进程号

core_users_pid 修改为1时,会在core文件名后添加上pid进程号。比如使用如下方式修改:

$echo '1' > /proc/sys/kernel/core_uses_pid

生成的core的文件名: core.23715 ,其中23715就是崩溃进程的进程号。

存储路径,以及更多个性化配置

通过 core_pattern ,可以修改core文件的存储路径,并且还定义了一些标签可以直接使用:

%%    a single % character
%p    PID of dumped process
%u    (numeric) real UID of dumped process
%g    (numeric) real GID of dumped process
%s    number of signal causing dump
%t    time of dump, expressed as seconds since the Epoch, 1970-01-01 00:00:00 +0000 (UTC)
%h    hostname (same as nodename returned by uname(2))
%e    executable filename (without path prefix)
%E    pathname of executable, with slashes ('/') replaced by exclamation marks ('!').
%c    core file size soft resource limit of crashing process (since Linux 2.6.24)

我们来测试一下添加存储路径以及程序名,进程号:

$mkdir /home/yoko/corepath
$echo '/home/yoko/corepath/core.%e' > /proc/sys/kernel/core_pattern

生成的core为: /home/yoko/corepath/core.a.out.25300


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK