メンテナンス・トラブルシュート - コマンド・ユーティリティ - core を出力させる
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
セグメントエラー (coreを出力しました)
> ulimit -a
core file size
> ulimit -a ulimit: コマンドが見つかりません.
> sudo ulimit -a sudo: ulimit: コマンドが見つかりません
> sudo /bin/bash -c 'ulimit -a'
> ulimit -c unlimited
> ulimit -c 数字
/etc/security/limits.conf
#* soft core 0
* soft core unlimited
> sysctl kern.sugid_coredump kern.sugid_coredump: 0 > sysctl kern.sugid_coredump=1 kern.sugid_coredump: 0 -> 1