Manpages

名 前

core − コ ア ダ ン プ フ ァ イ ル

説 明

あ る 種 の シ グ ナ ル を 受 け た 場 合 の デ フ ォ ル ト の ア ク シ ョ ン は 、 プ ロ セ ス を 終 了 し (terminate)、 コ ア ダ ン プ フ ァ イ ル (core dump file) を 生 成 す る こ と で あ る 。 コ ア ダ ン プ フ ァ イ ル は 、 デ ィ ス ク 上 に 生 成 さ れ る 終 了 時 の プ ロ セ ス の メ モ リ ー イ メ ー ジ を 内 容 と す る フ ァ イ ル で あ る 。 こ の イ メ ー ジ を デ バ ッ ガ (例 え ば gdb(1)) に 読 み 込 ん で 、 プ ロ グ ラ ム が 終 了 し た 時 点 の プ ロ グ ラ ム の 状 態 を 検 査 す る こ と が で き る 。 ど の シ グ ナ ル を 受 け た と き に プ ロ セ ス が コ ア ダ ン プ を 生 成 す る か の リ ス ト は signal(7) に 書 か れ て い る 。 プ ロ セ ス は ソ フ ト リ ソ ー ス 制 限 RLIMIT_CORE を 設 定 す る こ と で 、 「 コ ア ダ ン プ 」 シ グ ナ ル を 受 信 し た 際 に 生 成 さ れ る コ ア ダ ン プ フ ァ イ ル の サ イ ズ に 上 限 を 課 す こ と が で き る 。 詳 細 は getrlimit(2) を 参 照 。 コ ア ダ ン プ フ ァ イ ル が 生 成 さ れ な い 状 況 が い く つ か あ る :

* プ ロ セ ス が コ ア フ ァ イ ル を 書 き 込 む 許 可 を 持 た な い 場 合

(デ フ ォ ル ト で

は 、 コ ア フ ァ イ ル は corecore.pid (pid は コ ア ダ ン プ を 行 う プ ロ セ ス の ID) と い う 名 前 で 、 カ レ ン ト ワ ー キ ン グ デ ィ レ ク ト リ に 生 成 さ れ る 。 命 名 規 則 の 詳 細 は 下 記 を 参 照 )。 コ ア フ ァ イ ル を 生 成 し よ う と し た デ ィ レ ク ト リ が 書 き 込 み 可 能 で な い 場 合 、 も し く は 同 じ 名 前 の フ ァ イ ル が 存 在 し 、 そ の フ ァ イ ル が 書 き 込 み 可 能 で も 通 常 の フ ァ イ ル で も な い 場 合 (例 え ば 、 デ ィ レ ク ト リ や シ ン ボ リ ッ ク リ ン ク )、 コ ア フ ァ イ ル の 生 成 は 失 敗 す る 。

* コ ア ダ ン プ に 使 お う と し た の と 同 じ 名 前 の

(書 き 込 み 可 能 な 、 通 常 の ) フ ァ

イ ル が す で に 存 在 し 、 そ の フ ァ イ ル に 対 す る ハ ー ド リ ン ク が 2個 以 上 あ る 場 合 。

* コ ア ダ ン プ フ ァ イ ル を 生 成 し よ う と し た フ ァ イ ル シ ス テ ム が フ ル で あ る か 、

inode が 全 て 使 用 さ れ て い る か 、 読 み 込 み 専 用 で マ ウ ン ト さ れ て い る 場 合 。 ま た は 、 そ の ユ ー ザ ー の デ ィ ス ク 使 用 量 が そ の フ ァ イ ル シ ス テ ム の ク オ ー タ (quota) に 達 し て い る 。

* コ ア ダ ン プ フ ァ イ ル を 生 成 し よ う と し た デ ィ レ ク ト リ が 存 在 し な い 場 合 。

* プ ロ セ ス 毎 の リ ソ ー ス 制 限

RLIMIT_CORE (コ ア フ ァ イ ル の サ イ ズ ) か RLIMIT_FSIZE (フ ァ イ ル サ イ ズ ) が 0 に 設 定 さ れ て い る 場 合 。 getrlimit(2) や シ ェ ル の ulimit コ マ ン ド の ド キ ュ メ ン ト (csh(1) の limit) を 参 照 。

* プ ロ セ ス が 実 行 し た バ イ ナ リ フ ァ イ ル の 読 み 出 し 許 可 が 有 効 に な っ て い な い 場 合 。

* プ ロ セ ス が 実 行 し て い る

set−user−ID (set−group−ID) プ ロ グ ラ ム の 所 有 者 の ユ ー ザ ー (グ ル ー プ ) が 、 プ ロ セ ス の 実 UID (実 GID) と 異 な る 場 合 (但 し 、 prctl(2) PR_SET_DUMPABLE 操 作 の 説 明 と 、 proc(5)/proc/sys/fs/suid_dumpable フ ァ イ ル の 説 明 も 参 照 の こ と )。

*

(Linux 3.7 以 降 ) カ ー ネ ル の 設 定 で CONFIG_COREDUMP オ プ シ ョ ン が 有 効 に な っ て い な い 。

上 記 に 加 え て 、 madvise(2)MADV_DONTDUMP フ ラ グ が 使 用 さ れ て い る 場 合 、 プ ロ セ ス の ア ド レ ス 空 間 の 一 部 が コ ア ダ ン プ か ら 除 外 さ れ る 場 合 が あ る 。 コ ア ダ ン プ フ ァ イ ル の 名 前 デ フ ォ ル ト で は 、 コ ア ダ ン プ フ ァ イ ル の 名 前 は core と な る が 、 コ ア ダ ン プ フ ァ イ ル の 名 前 を 決 め る の に 使 わ れ る テ ン プ レ ー ト を /proc/sys/kernel/core_pattern フ ァ イ ル に 定 義 す る こ と で 、 フ ァ イ ル 名 を 変 更 す る こ と が で き る (/proc/sys/kernel/core_pattern は Linux 2.6 お よ び 2.4.21 以 降 で 利 用 で き る )。 テ ン プ レ ー ト に は % 指 示 子 (specifier) を 入 れ る こ と が で き る 。 こ れ は コ ア フ ァ イ ル が 生 成 さ れ る 際 に 、 以 下 の 値 に 置 き 換 え ら れ る 。

%%

1 つ の % 文 字

%c

ク ラ ッ シ ュ し た プ ロ セ ス の コ ア フ ァ イ ル の サ イ ズ に 関 す る ソ フ ト リ ソ ー ス 上 限 (Linux 2.6.24 以 降 )
%d ダ ン プ モ ー ド — prctl(2) PR_GET_DUMPABLE が 返 す 値 と 同 じ (Linux

3.7 以 降 )

%e 実 行 フ ァ イ ル 名

(パ ス 名 の プ レ フ ィ ッ ク ス は 含 ま れ な い )

%E 実 行 フ ァ イ ル の パ

ス 名 。 ス ラ ッ シ ュ ('/') は 感 嘆 符 ('!') に 置 き 換 え ら れ る 。 (Linux 3.0 以 降 )

%g

ダ ン プ さ れ た プ ロ セ ス の 実 グ ル ー プ ID (real GID)
%h ホ ス ト 名 (uname(2) で 返 さ れ る nodename と 同 じ )

%p ダ ン プ さ れ

る プ ロ セ ス の PID; そ の プ ロ セ ス が 属 し て い る PID 名 前 空 間 で の PID

%P

ダ ン プ さ れ る プ ロ セ ス の PID; 元 の PID 名 前 空 間 で の 値 (Linux 3.12 以 降 )
%s

ダ ン プ を 引 き 起 こ し た シ グ ナ ル の 番 号

%t ダ ン プ 時 刻 、 紀 元

(Epoch; 1970−01−01 00:00:00 +0000 (UTC)) か ら

の 秒 数 。

%u ダ ン プ さ れ た プ ロ セ ス の 実 ユ ー ザ ー

ID (real UID)

テ ン プ レ ー ト の 末 尾 に 1 個 だ け % が あ る 場 合 、 そ の % は コ ア フ ァ イ ル 名 に は 含 め ら れ な い 。 ま た 、 上 で 列 挙 さ れ て い な い % と 文 字 の 組 み 合 わ せ が あ っ た 場 合 も 同 様 で あ る 。 テ ン プ レ ー ト に お け る 他 の 文 字 は 、 コ ア フ ァ イ ル 名 と し て そ の ま ま 使 わ れ る 。 テ ン プ レ ー ト に は '/' 文 字 を 入 れ る こ と が で き 、 デ ィ レ ク ト リ 名 の 区 切 り 文 字 と 解 釈 さ れ る 。 結 果 と し て 生 成 さ れ る コ ア フ ァ イ ル 名 の 最 大 サ イ ズ は 128 バ イ ト で あ る (2.6.19 よ り 前 の カ ー ネ ル で は 64 バ イ ト )。 こ の フ ァ イ ル の デ フ ォ ル ト 値 は "core" で あ る 。 以 前 の も の と の 互 換 性 の た め 、 /proc/sys/kernel/core_pattern に "%p" が 含 ま れ ず 、 か つ /proc/sys/kernel/core_uses_pid (下 記 参 照 ) が 0 で な い 場 合 は 、 .PID が コ ア フ ァ イ ル 名 に 追 加 さ れ る 。 バ ー ジ ョ ン 2.4 以 降 の Linux で は コ ア ダ ン プ フ ァ イ ル の 名 前 を 制 御 す る 原 始 的 な 方 法 も 提 供 さ れ て い る 。 /proc/sys/kernel/core_uses_pid フ ァ イ ル に 値 0 が 書 か れ て い る 場 合 、 コ ア ダ ン プ フ ァ イ ル は 単 純 に core と い う 名 前 に な る 。 こ の フ ァ イ ル に 0 以 外 の 値 が 書 か れ て い る 場 合 、 コ ア ダ ン プ フ ァ イ ル は core.PID と い う 形 式 の 名 前 に な り 、 フ ァ イ ル 名 に プ ロ セ ス ID が 含 ま れ る 。

Linux 3.6 以 降 で は 、 /proc/sys/fs/suid_dumpable が 2 ("suidsafe") に 設 定 さ れ て い る 場 合 、 テ ン プ レ ー ト は 、 絶 対 パ ス 名 (先 頭 に '/' 文 字 が あ る パ ス 名 ) か パ イ プ (以 下 で 説 明 ) の ど ち ら か で な け れ ば な ら な い 。 コ ア ダ ン プ の プ ロ グ ラ ム へ の パ イ プ カ ー ネ ル 2.6.19 以 降 で は 、 Linux は /proc/sys/kernel/core_pattern フ ァ イ ル の 別 の 構 文 を サ ポ ー ト し て い る 。 こ の フ ァ イ ル の 最 初 の 文 字 が パ イ プ 記 号 (|) で あ れ ば 、 そ の 行 の 残 り の 部 分 は 実 行 す る プ ロ グ ラ ム と し て 解 釈 さ れ る 。 コ ア ダ ン プ は 、 デ ィ ス ク 上 の フ ァ イ ル に 書 き 込 ま れ る の で は な く 、 プ ロ グ ラ ム の 標 準 入 力 と し て 渡 さ れ る 。 以 下 の 点 に 注 意 す る こ と 。

* プ ロ グ ラ ム は 絶 対 パ ス 名

(も し く は ル ー ト デ ィ レ ク ト リ / か ら の 相 対 パ ス

名 ) で 指 定 さ れ な け れ ば な ら な い 。 ま た 、 ’|’ 文 字 の 直 後 か ら 始 め な け れ ば な ら な い 。

* プ ロ グ ラ ム を 実 行 す る た め に 生 成 さ れ る プ ロ セ ス は 、 ユ ー ザ ー 、 グ ル ー プ と も

root と し て 実 行 さ れ る 。

* コ マ ン ド ラ イ ン 引 き 数 を プ ロ グ ラ ム に 与 え る こ と が で き

(Linux 2.6.24 以

降 )、 引 き 数 は ホ ワ イ ト ス ペ ー ス で 区 切 る (1行 の 最 大 長 は 128 バ イ ト が 上 限 で あ る )。

* コ マ ン ド ラ イ ン 引 き 数 に は 、 上 記 の リ ス ト に あ る

% 指 示 子 を 含 め る こ と が

で き る 。 例 え ば 、 ダ ン プ さ れ る プ ロ セ ス の PID を 渡 す に は 、 引 き 数 に %p を 指 定 す る 。 ど の マ ッ ピ ン グ を コ ア ダ ン プ に 書 き 込 む か を 制 御 す る カ ー ネ ル 2.6.23 以 降 で は 、 Linux 固 有 の フ ァ イ ル /proc/PID/coredump_filter を 使 っ て 、 対 応 す る プ ロ セ ス ID を 持 つ プ ロ セ ス に 対 し て コ ア ダ ン プ が 行 わ れ る 際 に 、 ど の メ モ リ ー セ グ メ ン ト を コ ア ダ ン プ フ ァ イ ル に 書 き 込 む か を 制 御 で き る 。 こ の フ ァ イ ル の 値 は メ モ リ ー マ ッ ピ ン グ 種 別 (mmap(2) 参 照 ) の ビ ッ ト マ ス ク で あ る 。 マ ス ク 内 の あ る ビ ッ ト が セ ッ ト さ れ る と 、 そ の ビ ッ ト に 対 応 す る 種 別 の メ モ リ ー マ ッ ピ ン グ が ダ ン プ さ れ る 。 セ ッ ト さ れ て い な い も の は ダ ン プ さ れ な い 。 こ の フ ァ イ ル の 各 ビ ッ ト は 以 下 の 意 味 を 持 つ 。

bit 0 無 名 の プ ラ イ ベ ー ト マ ッ ピ ン グ

(anonymous private mappings) を

ダ ン プ す る 。

bit 1 無 名 の 共 有 マ ッ ピ ン グ

(anonymous shared mappings) を ダ ン プ す

る 。

(file−backed

bit 2 フ ァ イ ル と 関 連 付 け ら れ た プ ラ イ ベ ー ト マ ッ ピ ン グ

private mappings) を ダ ン プ す る 。

bit 3 フ ァ イ ル と 関 連 付 け ら れ た 共 有 マ ッ ピ ン グ

(file−backed shared

mappings) を ダ ン プ す る 。

bit 4 (Linux 2.6.24 以 降 )

ELF ヘ ッ ダ ー を ダ ン プ す る 。

bit 5 (Linux 2.6.28 以 降 ) プ ラ イ ベ ー ト な ヒ ュ ー ジ ペ ー ジ (private huge page) を ダ ン プ す る 。
bit 6 (Linux 2.6.28 以 降 ) 共 有 さ れ た ヒ ュ ー ジ ペ ー ジ (shared huge page) を ダ ン プ す る 。 デ フ ォ ル ト で は 、 ビ ッ ト 0, 1, 4, 5 が セ ッ ト さ れ る 。 (ビ ッ ト 4 が セ ッ ト さ れ る の は 、 カ ー ネ ル が 設 定 オ プ シ ョ ン CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS を 有 効 に し て 作 成 さ れ た 場 合 で あ る )。 こ の フ ァ イ ル の 値 は 16 進 形 式 で 表 示 さ れ る (し た が っ て 、 デ フ ォ ル ト 値 は 33 と 表 示 さ れ る )。

coredump_filter の 値 に 関 わ ら ず 、 フ レ ー ム バ ッ フ ァ ー な ど の memory−mapped I/O に 関 す る ペ ー ジ は 決 し て ダ ン プ さ れ ず 、 仮 想 DSO ペ ー ジ は 常 に ダ ン プ さ れ る 。

fork(2) で 作 成 さ れ る 子 プ ロ セ ス は 親 プ ロ セ ス の coredump_filter の 値 を 継 承 す る 。 execve(2) の 前 後 で coredump_filter の 値 は 保 持 さ れ る 。 例 の よ う に 、 プ ロ グ ラ ム を 実 行 す る 前 に 親 シ ェ ル の coredump_filter を 設 定 し て お く と 役 立 つ こ と が あ る 。

$ echo 0x7 > /proc/self/coredump_filter
$ ./some_program こ の フ ァ イ ル が 提 供 さ れ る の は 、 カ ー ネ ル が 設 定 オ プ シ ョ ン CONFIG_ELF_CORE を 有 効 に し て 作 成 さ れ た 場 合 だ け で あ る 。

注 意

gdb(1)gcore コ マ ン ド を 使 用 す る と 、 実 行 中 の プ ロ セ ス の コ ア ダ ン プ を 取 得 で き る 。 バ ー ジ ョ ン 2.6.27 以 前 の Linux で は 、 マ ル チ ス レ ッ ド プ ロ セ ス (よ り 正 確 に は 、 clone(2)CLONE_VM で 生 成 さ れ た 別 プ ロ セ ス と メ モ リ ー を 共 有 し て い る プ ロ セ ス ) が コ ア ダ ン プ を 生 成 す る 場 合 、 コ ア フ ァ イ ル 名 に プ ロ セ ス ID が 必 ず 付 加 さ れ る 。 た だ し 、 /proc/sys/kernel/core_pattern の %p 指 定 に よ り コ ア フ ァ イ ル 名 の ど こ か 他 の 場 所 に プ ロ セ ス ID が す で に 含 ま れ て い る 場 合 は 、 プ ロ セ ス ID が 末 尾 に 付 加 さ れ な い 。 (こ の 機 能 が 主 に 役 に 立 つ の は す で に 使 わ れ な く な っ た LinuxThreads 実 装 を 利 用 し て い る 場 合 で あ る 。 LinuxThreads 実 装 で は 、 プ ロ セ ス 内 の 個 々 の ス レ ッ ド は 異 な る プ ロ セ ス ID を 持 つ 。 )

以 下 の プ ロ グ ラ ム は /proc/sys/kernel/core_pattern フ ァ イ ル の パ イ プ 構 文 の 使 用 例 を 示 し て い る 。 以 下 の シ ェ ル の セ ッ シ ョ ン は こ の プ ロ グ ラ ム の 使 用 例 を 示 す も の で あ る (コ ン パ イ ル し て core_pattern_pipe_test と い う 名 前 の 実 行 フ ァ イ ル を 作 成 し て い る )。

$ cc −o core_pattern_pipe_test core_pattern_pipe_test.c
$ su
Password:
# echo "|$PWD/core_pattern_pipe_test %p UID=%u GID=%g sig=%s" > \
/proc/sys/kernel/core_pattern

# exit
$ sleep 100
^\
# type control−backslash
Quit (core dumped)
$ cat core.info
argc=5
argc[0]=</home/mtk/core_pattern_pipe_test>
argc[1]=<20575>
argc[2]=<UID=1000>
argc[3]=<GID=100>
argc[4]=<sig=3>
Total bytes in core dump: 282624 プ ロ グ ラ ム の ソ ー ス

/* core_pattern_pipe_test.c */

#define _GNU_SOURCE
#include <sys/stat.h>
#include <fcntl.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define BUF_SIZE 1024

int
main(int argc, char *argv[])
{
int tot, j;
ssize_t nread;
char buf[BUF_SIZE];
FILE *fp;
char cwd[PATH_MAX];

/* Change our current working directory to that of the
crashing process */

snprintf(cwd, PATH_MAX, "/proc/%s/cwd", argv[1]);
chdir(cwd);

/* Write output to file "core.info" in that directory */

fp = fopen("core.info", "w+");
if (fp == NULL)
exit(EXIT_FAILURE);

/* Display command−line arguments given to core_pattern
pipe program */

fprintf(fp, "argc=%d\n", argc);
for (j = 0; j < argc; j++)
fprintf(fp, "argc[%d]=<%s>\n", j, argv[j]);

/* Count bytes in standard input (the core dump) */

tot = 0;
while ((nread = read(STDIN_FILENO, buf, BUF_SIZE)) > 0)
tot += nread;
fprintf(fp, "Total bytes in core dump: %d\n", tot);

fclose(fp);
exit(EXIT_SUCCESS); }

関 連 項 目

bash(1), gdb(1), getrlimit(2), mmap(2), prctl(2), sigaction(2), elf(5), proc(5), pthreads(7), signal(7)

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。