2009/05/28

Solaris에서 유요한 dtrace script : 읽으려고 시도했다가 에러 리턴된 것만 트레이스 하기

명령어 라인에서 한 줄로 실행하기 위해서는 다음과 같이 했습니다.(오픈솔라리스)
$pfexec dtrace -q -n 'syscall::open*:entry/execname != "gnome-netstatus-" && execname != "VBoxSVC"/{self->trace=timestamp;d=copyinstr(arg0);}' \
                        -n 'syscall::open*:return/self->trace&&arg1<0/{printf("%s:%d:%s(%d)\n",d,pid,execname,arg1);self->trace=0;}'  | tee /var/tmp/open2.log

gnome-netstatus- 와 VBoxSVC라는 프로세스에서 시도하는 open() call은 회피합니다. 너무 많아서.

script로 바꾸면 다음과 같이 작성합니다.

#/usr/sbin/dtrace

syscall::open*:entry
/execname != "gnome-nstatus-" && execname != "VBoxSVC"/
{
            self->trace=timestamp;
            d=copyinstr(arg0);
}

syscall::open*:return
/self->trace && arg1<0/
{
            printf("%s:%d:%s(%d)\n",d,pid,execname,arg1);
            self->trace=0;
}

eopen.d
라고 이름을 지었다면

dtrace -s eopen.d
라고 실행합니다.

결과는 다음과 같습니다.
....
/var/pkg/pkg/SUNWavahi-bridge-dsd/0.5.11%2C5.11-0.101%3A20081119T214544Z/filters:3752:pkg(-1)
/var/pkg/pkg/SUNWlang-common/0.5.11%2C5.11-0.101%3A20081119T233506Z/filters:3752:pkg(-1)
/var/pkg/pkg/SUNWperl584man/5.8.4%2C5.11-0.101%3A20081119T215746Z/filters:3752:pkg(-1)
/var/pkg/pkg/SUNWadmap/0.5.11%2C5.11-0.101%3A20081119T214241Z/filters:3752:pkg(-1)
/var/pkg/pkg/SUNWgnome-l10nmessages-zhCN/0.5.11%2C5.11-0.101%3A20081119T233244Z/filters:3752:pkg(-1)
/var/pkg/pkg/SUNWnfsc/0.5.11%2C5.11-0.101%3A20081119T215559Z/filters:3752:pkg(-1)
/var/pkg/pkg/SUNWos86r/0.5.11%2C5.11-0.101%3A20081119T235320Z/filters:3752:pkg(-1)
....