(パ ス 名
の プ レ フ ィ ッ
ク ス は 含 ま れ
な い )
ス 名 。
ス ラ ッ シ ュ ('/') は
感 嘆 符 ('!') に 置 き
換 え ら れ る 。 (Linux
3.0 以 降 )
ダ ン プ
さ れ た プ ロ セ
ス の 実 グ ル ー
プ ID (real GID)
%h ホ ス ト 名 (uname(2)
で 返 さ れ る nodename
と 同 じ )
る プ ロ
セ ス の PID; そ の プ
ロ セ ス が 属 し
て い る PID 名 前 空
間 で の PID
ダ ン プ
さ れ る プ ロ セ
ス の 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/ に 書
か れ て い る 。
|