FreeBSD truss を使ってシステムコールを追跡2014年12月10日 13時00分11秒

FreeBSD にもかなり前からシステムコールを追跡する truss コマンドが存在する。Solaris のものを参考に書かれたようだ。ktrace にかなり類似している。

truss は初期値では、出力が標準エラーに出される。折角なので、ktrace と比べてみる。


% truss echo |& less
mmap(0x0,32768,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 671481856 (0x28060000)
issetugid(0x2805f500,0xbfbfefc6,0x20,0x0,0x0,0x0) = 0 (0x0)
lstat("/etc",{ mode=drwxr-xr-x ,inode=22,size=2560,blksize=16384 }) = 0 (0x0)
lstat("/etc/libmap.conf",{ mode=-rw-r--r-- ,inode=908,size=109,blksize=16384 }) = 0 (0x0)
open("/etc/libmap.conf",O_CLOEXEC,027757756764)  = 3 (0x3)
fstat(3,{ mode=-rw-r--r-- ,inode=908,size=109,blksize=16384 }) = 0 (0x0)
mmap(0x0,109,PROT_READ,MAP_PRIVATE,3,0x0)        = 671514624 (0x28068000)
close(3)                                         = 0 (0x0)
lstat("/usr",{ mode=drwxr-xr-x ,inode=2,size=512,blksize=16384 }) = 0 (0x0)
lstat("/usr/local",{ mode=drwxr-xr-x ,inode=2,size=1024,blksize=16384 }) = 0 (0x0)
lstat("/usr/local/etc",{ mode=drwxr-xr-x ,inode=471040,size=2560,blksize=16384 }) = 0 (0x0)
lstat("/usr/local/etc/libmap.d",0xbfbfc4f0)      ERR#2 'No such file or directory'
munmap(0x28068000,109)                           = 0 (0x0)
open("/var/run/ld-elf.so.hints",O_CLOEXEC,00)    = 3 (0x3)

まず気が付くのは出力の違い。truss の方では関数の戻り値が呼び出しと同じ行に書かれるのに対し、trace では別の行になっている。

以下のものは、ktrace のもの。同じファイル名が同じ順で出てくるのが見て取れる。


  1368 echo     CALL  lstat(0x28065000,0xbfbfd138)
  1368 echo     NAMI  "/etc"
  1368 echo     STRU  struct stat {dev=99, ino=22, mode=040755, nlink=...
  1368 echo     RET   lstat 0
  1368 echo     CALL  lstat(0x28065000,0xbfbfd138)
  1368 echo     NAMI  "/etc/libmap.conf"
  1368 echo     STRU  struct stat {dev=99, ino=908, mode=0100644, nlink=...
  1368 echo     RET   lstat 0
  1368 echo     CALL  open(0x28065000,0x100000,0xbfbfddf4)
  1368 echo     NAMI  "/etc/libmap.conf"
  1368 echo     RET   open 3
  1368 echo     CALL  fstat(0x3,0xbfbfddd8)
  1368 echo     STRU  struct stat {dev=99, ino=908, mode=0100644, nlink=...

若干の違いはあるにしても、どちらも同じことを出来る。関数や引数によって見やすい方が違うので、適材適所で使い分けるのが賢明に思われる。