お薦め ページ


メニュー

ハワイ島 遊覧飛行ツアー

ハワイ島 B&B・ホテル

ハワイ島 不動産情報

ハワイ島 情報・観光ガイド

ブログ(Blog)

その他

関連サイト

: 個別エントリー・アーカイブ :

2007年9月13日

FreeBSDでシステムコール呼び出しをトレースする「truss」コマンド

最近のFreeBSDには、「truss」コマンド、というコマンドが付いてきている。 これで、プログラム中のシステムコール呼び出し部分をトレースすることができる。

まず FreeBSDでは procfs(5) が mountされていることが必要なので、 /etc/fstab に以下を加えて mount する。
proc    /proc   procfs  rw      0       0
マウントの方法は、
# mount -a
で、もう一度、引数なして mount コマンドを実行するか、もしくは dfコマンドで 確認できる。
# mount
/dev/ad0s1a on / (ufs, local)
devfs on /dev (devfs, local)
procfs on /proc (procfs, local)
# df
Filesystem  1K-blocks    Used    Avail Capacity  Mounted on
/dev/ad0s1a  18276366 2760552 14053706    16%    /
devfs               1       1        0   100%    /dev
procfs              4       4        0   100%    /proc


trussコマンドの例して、"hello" を echo する際に使われるシステムコールを追います
# truss /bin/echo hello
mmap(0x0,3952,PROT_READ|PROT_WRITE,MAP_ANON,-1,0x0) = 671555584 (0x28072000)
munmap(0x28072000,3952)                          = 0 (0x0)
__sysctl(0xbfbfeab8,0x2,0x2806e618,0xbfbfeab4,0x0,0x0) = 0 (0x0)
mmap(0x0,32768,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 671555584 (0x28072000)
issetugid()                                      = 0 (0x0)
open("/etc/libmap.conf",O_RDONLY,0666)           ERR#2 'No such file or directory'
open("/var/run/ld-elf.so.hints",O_RDONLY,00)     = 3 (0x3)
read(3,"Ehnt\^A\0\0\0\M^@\0\0\0V\0\0\0\0"...,128) = 128 (0x80)
lseek(3,0x80,SEEK_SET)                           = 128 (0x80)
read(3,"/lib:/usr/lib:/usr/lib/compat:/u"...,86) = 86 (0x56)
close(3)                                         = 0 (0x0)
access("/lib/libc.so.6",0)                       = 0 (0x0)
open("/lib/libc.so.6",O_RDONLY,00)               = 3 (0x3)
fstat(3,{mode=-r--r--r-- ,inode=376834,size=929420,blksize=4096}) = 0 (0x0)
read(3,"\^?ELF\^A\^A\^A\t\0\0\0\0\0\0\0"...,4096) = 4096 (0x1000)
mmap(0x0,946176,PROT_READ|PROT_EXEC,MAP_PRIVATE|MAP_NOCORE,3,0x0) = 671588352 (0x2807a000)
mprotect(0x28144000,4096,PROT_READ|PROT_WRITE|PROT_EXEC) = 0 (0x0)
mprotect(0x28144000,4096,PROT_READ|PROT_EXEC)    = 0 (0x0)
mmap(0x28145000,24576,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED,3,0xca000) = 672419840 (0x28145000)
mmap(0x2814b000,90112,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_FIXED|MAP_ANON,-1,0x0) = 672444416 (0x2814b000)
close(3)                                         = 0 (0x0)
sysarch(0xa,0xbfbfeb30)                          = 0 (0x0)
mmap(0x0,168,PROT_READ|PROT_WRITE,MAP_ANON,-1,0x0) = 672534528 (0x28161000)
munmap(0x28161000,168)                           = 0 (0x0)
mmap(0x0,22784,PROT_READ|PROT_WRITE,MAP_ANON,-1,0x0) = 672534528 (0x28161000)
munmap(0x28161000,22784)                         = 0 (0x0)
sigprocmask(SIG_BLOCK,SIGHUP|SIGINT|SIGQUIT|SIGKILL|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2,0x0) = 0 (0x0)
sigprocmask(SIG_SETMASK,0x0,0x0)                 = 0 (0x0)
readlink("/etc/malloc.conf",0xbfbfec20,63)       ERR#2 'No such file or directory'
issetugid()                                      = 0 (0x0)
mmap(0x0,4096,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 672534528 (0x28161000)
break(0x804b000)                                 = 0 (0x0)
break(0x804c000)                                 = 0 (0x0)
hello
writev(0x1,0x804b030,0x2)                        = 6 (0x6)
exit(0x0)
process exit, rval = 0
と、このように、簡単な echo コマンドでさえも、このように長い出力になる。

【参考リンク】

カテゴリー: FreeBSD     2007年9月13日 22:46

トラックバック

このエントリーのトラックバックURL:
http://www.skymerica.com/blog/yotsumoto/mt/mt-tb.cgi/921


コメント

コメントしてください




保存しますか?


 
ハワイ島での遊覧飛行ツアーとB&Bのスペシャリスト、スカイメリカ
Copyright © 2003,2009 Skymerica Corp. All rights reserved.