残された core から手がかりを探る
プロセスが何らかの理由で異常な状態になった場合、core ファイルを出力して終了してしまうことがあります。
core にはプロセス終了直前のメモリ状態などが記録されていて、デバッガ(FreeBSD ならば lldb)などを使えばどの関数でエラーが発生したかなど調べられます。しかしデバッガの操作はそれなりに面倒で欲しい情報が簡単にはわからない場合も多いです。
そこで procstat コマンドを使えば、終了直前のメモリ使用状況、
なんのファイルを開いていたか、環境変数がちゃんと切り替わっているかなど簡単に調べることができます。
また、procstat は core ファイルでなく現在動いているプロセスも、プロセスID指定で調べることができます。
FreeBSD 独自だからかあまり存在が認知されていない感じがする(気のせい?)なので紹介してみます。
基本
procstat コマンドは、なんの情報が欲しいかを指定するサブコマンドと、情報がほしいプロセスの pid(現在実行中のプロセス情報の取得) または coreファイル(すでに終了しているプロセスの情報の取得)をコマンドライン引数で指定して実行すると、その結果を表示します。
サブコマンドを指定しない場合はサブコマンド basic(基本情報)を指定したとみなして実行されます。
procstat (pid/core ファイル)
or
procstat basic (pid/core ファイル)
basic で得られる情報は実行時の pid/ppid/実行ユーザー名などです。
$ procstat kstars.core
PID PPID PGID SID TSID THR LOGIN WCHAN EMUL COMM
2030 1855 2030 1855 1855 13 suzuki - FreeBSD ELF64 kstars
開いてたファイル
設定ミスで変な場所のファイルを開いてた、なんてミスが起きてないか確認するには、サブコマンド file (または -f オプション)でなんのファイルを開いていたかをチェックします。
実行すると終了直前に開いていたファイルの一覧が得られます。
$ procstat file kstars.core
PID COMM FD T V FLAGS REF OFFSET PRO NAME
2030 kstars text v r r------- - - - /usr/local/bin/kstars
2030 kstars ctty v c rw------ - - - /dev/pts/0
2030 kstars cwd v d r------- - - - /usr/home/hige
2030 kstars root v d r------- - - - /
... (略)
コマンドライン引数
どんなコマンドラインで実行されたかは、pargs サブコマンドを指定します。
$ procstat pargs main.core
58384: main
argv[0]: ./main
argv[1]: -x
argv[2]: -y
main というコマンドを引数 -x と -y を指定して実行したことがわかります。
実行時の環境変数
環境変数でプロセスの処理が切り替わるというパターンは結構あるわけですが、実際に環境変数が思ったとおりにプロセスに渡っているか怪しい場合があります。
そんな場合はサブコマンド penv を指定して実行すると、実行時の環境変数一覧が得られます。
$ procstat penv kstars.core
2030: kstars
envp[0]: PAGER=more
envp[1]: VENDOR=amd
envp[2]: LANG=ja_JP.UTF-8
envp[3]: MM_CHARSET=UTF-8
envp[4]: XDG_CURRENT_DESKTOP=LXQt
envp[5]: GTK_CSD=0
envp[6]: QT_IM_MODULE=ibus
... (略)
実行コマンドのパス名
サブコマンド binary (または -bオプション)を指定すると、実行したコマンドのファイルパスがわかります。複数の場所にコマンドがインストールされいる場合、どのパスのコマンドでエラーが起きたかも知りたい情報です。
$ procstat binary kstars.core
PID COMM OSREL PATH
2030 kstars 1400073 /usr/local/bin/kstars
詳しくは man で
他にもスレッド情報取得など、サブコマンドがいろいろ用意されています。
より詳細な使い方は man procstatを見ながら試してみてください。