CORE(5) | Linux Programmer's Manual | CORE(5) |
core - コアダンプファイル
ある種のシグナルを受けた場合のデフォルトのアクションは、 プロセスを終了し (terminate)、 コアダンプファイル (core dump file) を生成することである。コアダンプファイルは、ディスク上に生成される 終了時のプロセスのメモリーイメージを内容とするファイルである。 このイメージをデバッガ (例えば gdb(1)) に読み込んで、 プログラムが終了した時点のプログラムの状態を検査することができる。 どのシグナルを受けたときにプロセスがコアダンプを生成するかのリストは signal(7) に書かれている。
プロセスはソフトリソース制限 RLIMIT_CORE を設定することで、「コアダンプ」シグナルを受信した際に生成される コアダンプファイルのサイズに上限を課すことができる。詳細は getrlimit(2) を参照。
コアダンプファイルが生成されない状況がいくつかある:
上記に加えて、 madvise(2) の MADV_DONTDUMP フラグが使用されている場合、プロセスのアドレス空間の一部がコアダンプから除外される場合がある。
デフォルトでは、コアダンプファイルの名前は core となるが、コアダンプファイルの名前を決めるのに使われるテンプレートを /proc/sys/kernel/core_pattern ファイルに定義することで、ファイル名を変更することができる (/proc/sys/kernel/core_pattern は Linux 2.6 および 2.4.21 以降で利用できる)。 テンプレートには % 指示子 (specifier) を入れることができる。 これはコアファイルが生成される際に、以下の値に置き換えられる。
テンプレートの末尾に 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 ファイルの別の構文をサポートしている。 このファイルの最初の文字がパイプ記号 (|) であれば、 その行の残りの部分は実行するプログラムとして解釈される。 コアダンプは、ディスク上のファイルに書き込まれるのではなく、 プログラムの標準入力として渡される。 以下の点に注意すること。
カーネル 2.6.23 以降では、Linux 固有のファイル /proc/PID/coredump_filter を使って、対応するプロセス ID を持つプロセスに対してコアダンプが行われる 際に、どのメモリーセグメントをコアダンプファイルに書き込むかを制御できる。
このファイルの値はメモリーマッピング種別 (mmap(2) 参照) のビットマスクである。 マスク内のあるビットがセットされると、そのビットに対応する種別の メモリーマッピングがダンプされる。セットされていないものはダンプされない。 このファイルの各ビットは以下の意味を持つ。
デフォルトでは、ビット 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/ に書かれている。
2014-08-19 | Linux |