この章では、coreadm コマンドを使って、コマンドファイルを管理する方法について説明します。
コアファイルの管理に関連する手順の詳細については、コアファイルの管理 (作業マップ)を参照してください。
作業 |
説明 |
参照先 |
---|---|---|
1. 現在のコアダンプ構成を表示する |
coreadm コマンドを使用して、現在のコアダンプ構成を変更する | |
2. コアダンプ構成を変更する |
次のいずれかの手順を実行して、コアダンプ構成を変更する |
|
|
コアファイル名パターンを設定する | |
|
プロセス別コアファイルのパスを有効にする | |
|
グローバルのコアファイルのパスを有効にする | |
3. コアダンプファイルを調べる |
proc ツールを使用して、コアダンプファイルを表示する |
コアファイルは、プロセスまたはアプリケーションが異常終了したときに生成されます。コアファイルは coreadm コマンドで管理します。
たとえば、coreadm コマンドを使用して、プロセスコアファイルをすべて同じシステムディレクトリに置くようにシステムを構成できます。Solaris のプロセスやデーモンが異常終了した場合に、特定のディレクトリにあるコアファイルを調べればよいため、問題の追跡が容易になります。
次の 2 つの構成可能な新しいコアファイルのパスは、個別に有効または無効にすることができます。
プロセス別コアファイルのパスにはデフォルトで core が使用されます。このパスはデフォルトで有効になっています。プロセス別コアファイルのパスが有効になっていると、プロセスが異常終了したときに core ファイルが生成されます。プロセス別のパスは、親プロセスから新しいプロセスに継承されます。
プロセス別コアファイルは生成されるとプロセスの所有者によって所有され、所有者には読み取り/書き込み権が与えられます。所有者だけがこのファイルを表示できます。
グローバルコアファイルのパスにはデフォルトで core が使用されます。このパスはデフォルトで無効になっています。このパスが有効になっていると、プロセス別コアファイルのパスと同じ内容のコアファイルがグローバルコアファイルのパスに追加で作成されます。
グローバルコアファイルは生成されるとスーパーユーザーによって所有され、スーパーユーザーだけに読み取り/書き込み権が与えられます。アクセス権のないユーザーはこのファイルを表示できません。
プロセスが異常終了すると、以前の Solaris リリースと同じように core ファイルが現在のディレクトリに作成されます。しかし、たとえば、グローバルコアファイルのパスが有効で /corefiles/core に設定されていると、プロセスが終了するたびにコアファイルが 2 つ、1 つは現在の作業ディレクトリに、1 つは /corefiles ディレクトリにそれぞれ作成されます。
デフォルトでは、setuid プロセスは、グローバルの設定やプロセス別のパスを使ってコアファイルを生成することはありません。
グローバルコアファイルディレクトリが有効な場合、次の表に示す変数を使って core ファイルを相互に区別できます。
変数名 |
変数の定義 |
---|---|
%p |
プロセス ID |
%u |
実効ユーザー ID |
%g |
実効グループ ID |
%f |
実行可能ファイル名 |
%n |
システムノード名。uname -n の出力と同じ |
%m |
マシン名。uname -m での出力と同じ |
%t |
time(2) システム呼び出しの 10 進数 |
%% |
リテラル % |
たとえば、グローバルコアファイルパスが次のように設定されている場合、
/var/core/core.%f.%p
PID 12345 の sendmail プロセスが異常終了すると、次の core ファイルが作成されます。
/var/core/core.sendmail.12345
コアファイル名パターンは、グローバルに設定したりプロセス単位で設定したりできます。さらに、この設定をシステムリブート後も有効になるように保存するかどうかを指定できます。
たとえば、次の coreadm コマンドでは、init プロセスで起動されたすべてのプロセスに対しグローバルのコアファイルパターンを設定します。このパターンは複数のシステムリブート後も有効です。
$ coreadm -i /var/core/core.%f.%p |
グローバルのコア値は /etc/coreadm.conf ファイルに格納されるため、この設定値はシステムリブート後も有効になるように保存されます。
次の coreadm コマンドでは、すべてのプロセスに対しプロセス別コアファイル名パターンを設定します。
$ coreadm -p /var/core/core.%f.%p $$ |
$$ 記号には、現在実行中のシェルのプロセス ID を指定します。プロセス別コアファイル名パターンは、すべての子プロセスに継承されます。
グローバルまたはプロセス別のコアファイル名パターンを設定したら、これを coreadm -e コマンドで有効にする必要があります。詳細については次の手順を参照してください。
このコマンドをユーザーの $HOME/.profile または .login ファイルに入れておけば、ユーザーのログインセッションで実行するすべてのプロセスに対しコアファイル名パターンを設定できます。
coreadm コマンドを使って setuid プログラムを有効または無効にすれば、次の設定を行うことによって、すべてのシステムプロセスに対して、または各プロセスに対してコアファイルを作成できます。
グローバル setuid オプションが有効になっていると、グローバルコアファイルパスに従って、システムのすべての setuid プログラムが core ファイルを作成します。
プロセス別 setuid オプションが有効になっていると、プロセス別コアファイルパスに従って、特定の setuid プロセスが core ファイルを作成します。
デフォルトでは、両方のフラグが無効になっています。セキュリティ上の理由により、グローバルコアファイルパスは、/ で始まるフルパス名であることが必要です。スーパーユーザーがプロセス別コアファイルを無効にすると、個別のユーザーがコアファイルを得ることはできなくなります。
setuid コアファイルはスーパーユーザーによって所有され、スーパーユーザーだけに読み取り/書き込み権が与えられます。通常ユーザーは、たとえ setuid コアファイルを生成したプロセスを所有していても、それらのファイルにアクセスできません。
詳細については、coreadm(1M) のマニュアルページを参照してください。
現在のコアダンプ構成を表示するには、オプションを指定しないで coreadm コマンドを実行します。
$ coreadm global core file pattern: /var/core/core.%f.%p init core file pattern: core global core dumps: enabled per-process core dumps: enabled global setid core dumps: enabled per-process setid core dumps: disabled global core dump logging: disabled |
プロセス別コアファイルパスを有効にします。
# coreadm -e process |
現在のプロセスのコアファイルパスを表示して構成を確認します。
$ coreadm $$ 1180: /home/kryten/corefiles/%f.%p |
グローバルのコアファイルパスを有効にします。
# coreadm -e global -g /var/core/core.%f.%p |
現在のプロセスのコアファイルパスを表示して構成を確認します。
# coreadm global core file pattern: /var/core/core.%f.%p init core file pattern: core global core dumps: enabled per-process core dumps: enabled global setid core dumps: disabled per-process setid core dumps: disabled global core dump logging: disabled |
NOTICE: 'set allow_setid_core = 1' in /etc/system is obsolete NOTICE: Use the coreadm command instead of 'allow_setid_core' |
setuid コアファイルを許容する古いパラメータが /etc/system ファイルにあります。
/etc/system ファイルから allow_setid_core=1 を削除し、coreadm コマンドを使ってグローバル setuid コアファイルの設定を有効にします。
一部の proc ツールが拡張されてプロセスのコアファイルやライブプロセスが調べられるようになりました。proc ツールは、/proc ファイルシステムの機能を操作するユーティリティです。
現在、コアファイルを処理できるツールは /usr/proc/bin ディレクトリにある pstack、pmap、pldd、pflags、pcred です。これらのツールを使用するには、プロセス ID を指定するように、コアファイルの名前をコマンド行に指定します。
proc ツールを使用してコアファイルを調べる方法については、proc(1) のマニュアルページを参照してください。
$ ./a.out Segmentation Fault(coredump) $ /usr/proc/bin/pstack ./core core './core' of 19305: ./a.out 000108c4 main (1, ffbef5cc, ffbef5d4, 20800, 0, 0) + 1c 00010880 _start (0, 0, 0, 0, 0, 0) + b8 |