ktrace で FreeBSD 上のプロセスを調べる
2014-12-09


ktrace はカーネル内の処理を追いかける機構。4.4 BSD の頃からあるから FreeBSD だけでなく、NetBSD や OpenBSD にもある。ktrace はバイナリ形式の出力を出すので、それを kdump を使って可読方式にする。ファイル名を指定しない場合は、ktrace.out を使うようになっている。

以下は、FreeBSD RELEASE 10.1 を用いたときの出力の一部。echo のみの ktrace でも 148 行にもおよび、様々なファイルやライブラリがプロセス起動のために読み込まれるのが分かる。

まずは、単純に「echo」のみを ktrace を用いて実行。


% ktrace echo
% kdump | less
  1514 ktrace   RET   ktrace 0
  1514 ktrace   CALL  execve(0xbfbfe3c0,0xbfbfe8dc,0xbfbfe8e4)
  1514 ktrace   NAMI  "/sbin/echo"
  1514 ktrace   RET   execve -1 errno 2 No such file or directory
  1514 ktrace   CALL  execve(0xbfbfe3c0,0xbfbfe8dc,0xbfbfe8e4)
  1514 ktrace   NAMI  "/bin/echo"
  1514 ktrace   NAMI  "/libexec/ld-elf.so.1"
  1514 echo     RET   execve 0
  1514 echo     CALL  mmap(0,0x8000,0x3,0x1002,0xffffffff,0,0)
  1514 echo     RET   mmap 671481856/0x28060000
プロセス番号の 1524 が ktrace として始まり、そこから echo コマンドを探しているのが分かる。/bin/echo を見付けて、execve で新しいプログラムの実行を開始。

新しいプログラムの実行が始まっても、まだ道のりは長い。ライブラリの読み込みが始まる。


  1514 echo     RET   mmap 671481856/0x28060000
  1514 echo     CALL  issetugid
  1514 echo     RET   issetugid 0
  1514 echo     CALL  lstat(0x28065000,0xbfbfd238)
  1514 echo     NAMI  "/etc"
  1514 echo     STRU  struct stat {dev=99, ino=22, mode=040755, nlink=...
  1514 echo     RET   lstat 0
  1514 echo     CALL  lstat(0x28065000,0xbfbfd238)
  1514 echo     NAMI  "/etc/libmap.conf"
  1514 echo     STRU  struct stat {dev=99, ino=908, mode=0100644, nlink=...
  1514 echo     RET   lstat 0
  1514 echo     CALL  open(0x28065000,0x100000,0xbfbfdef4)
  1514 echo     NAMI  "/etc/libmap.conf"
  1514 echo     RET   open 3
  1514 echo     CALL  fstat(0x3,0xbfbfded8)

echo の本体は更に進んだ後のこれ。


  1514 echo     CALL  writev(0x1,0x28803050,0x1)
  1514 echo     GIO   fd 1 wrote 1 byte
       "
       "
  1514 echo     RET   writev 1
writev でファイルディスクリプタの 1 に一バイト書き出している。
[FreeBSD]
[sys]

コメント(全0件)
コメントをする


記事を書く
powered by ASAHIネット