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