bionic (5) core.5.gz

Provided by: manpages-ja_0.5.0.0.20161015+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/ に書かれている。