FreeBSD truss を使ってシステムコールを追跡 ― 2014年12月10日 13時00分11秒
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=...
若干の違いはあるにしても、どちらも同じことを出来る。関数や引数によって見やすい方が違うので、適材適所で使い分けるのが賢明に思われる。
最近のコメント