メンテナンス・トラブルシュート - コマンド・ユーティリティ - core を出力させる
- 1. 問題
- 2. ulimit の値を見る
- 3. ulimit の値をテンポラリに変更する
- 4. ulimit の値をパーマネントに変更する
- 5. kern.sugid_coredump の設定
1. 問題
自分でつくったプログラムが
セグメントエラー (coreを出力しました)
なんつう出力とともに落ちちゃったのです。
で、「core」を使ってデバッグしようとしたら・・・。
「core」がないわけです。
2. ulimit の値を見る
「B」シェル系には、「ulimit」というコマンドがありまして・・・。
これがリソースの制限をかけたり、表示したりというものです。
「C」シェル系では「limit」、「unlimit」というコマンドになります。
「FreeBSD」では、「C」シェル系でも「ulimit」というコマンドが使えます。
$ ulimit -a
で、現在のリソースの制限状態を見ることができます。
複数行出てくると思いますが、先頭に
core file size
と書いてある行が、「core」に対するリソース・出力ファイルサイズの制限値になります。
このサイズが「0」になっていれば、「coreを出力しました」というメッセージが出ても実際には出力されません。
逆にこのサイズが「unlimited」になっていれば、ファイルサイズに関しては無制限に(実際にはディスクの物理的な制限はありますが)出力されます。
ちなみにこの「ulimit」は内部コマンドでありまして、「which」や「where」で探しても見当たりません。
「Linux」の場合、さらにややこしく、「root」ユーザ権限がないとコマンドが有効にならないため、一般ユーザで使用すると
$ ulimit -a
ulimit: コマンドが見つかりません.
てなことになりますし、「sudo」コマンドを使用しても
$ sudo ulimit -a
sudo: ulimit: コマンドが見つかりません
となりますので
$ sudo /bin/bash -c 'ulimit -a'
と入力することになります。
「/bin/bash」の部分は、「ulimit」コマンドが有効なシェルであればなんでもかまいません。
3. ulimit の値をテンポラリに変更する
テンポラリにこれを変更するには
ulimit -c unlimited
もしくは
ulimit -c 数字
を使用します。数字で入力する場合、単位がシステムによって異なることがありますので、「unlimited」の方がおすすめです。
4. ulimit の値をパーマネントに変更する
「FreeBSD」に関しては、ハンドブックの「第13章 ユーザと基本的なアカウントの管理」「13.4. ユーザへの制限」を読めば大体わかるかと思います。
「Linux」の場合
/etc/security/limits.conf
というファイルを編集します。
「core」を変更する場合は
#* soft core 0
の先頭の「#」をはずして
* soft core unlimited
に書き換えて、再起動します。
5. kern.sugid_coredump の設定
「apache」等が異常終了するときに「core」を吐かせるには前項までの設定では不十分で。
「sysctl」の「kern.sugid_coredump」の設定値が「0」であれば「1」へと変更する必要があります。
$ sysctl kern.sugid_coredump
kern.sugid_coredump: 0
$ sysctl kern.sugid_coredump=1
kern.sugid_coredump: 0 -> 1
|
|