3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

FreeBSDAdvent Calendar 2022

Day 9

異常終了時に吐かれた core ファイルから procstat を使ってプロセス情報を調べる

Last updated at Posted at 2022-12-10

残された 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を見ながら試してみてください。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?