Provided by: manpages-ja_0.5.0.0.20210215+dfsg-1_all bug

名前

       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) をダンプする。
           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/ に書かれている。