perl 5.10.1 でdtrace環境構築

#dtraceday 記念。

perl と dtrace についてですが、perl5.8.8はSunの人からpatchが公開されていました。

最新バージョンの perl5.10.1(releaseから、半年以上経ってますが) ではpatchなしでコンパイルオプションを指定することで利用可能です。
(そのまま取り込んだ感じ?http://blogs.sun.com/alanbur/date/20050909

ただ、Makefile内の依存関係にバグがあるので(既にチケット切られててパッチがある?)
少し手直しがいります。

そのままコンパイルすると、以下のように miniperl作るのにperldtrace.o がないと言われます。


$ make
...
/usr/bin/cc -L/usr/lib -L/usr/ccs/lib -L/opt/sunstudio12.1/prod/lib -L/lib -L/usr/local/lib -o miniperl \
gv.o toke.o perly.o pad.o regcomp.o dump.o util.o mg.o reentr.o mro.o hv.o av.o run.o pp_hot.o sv.o pp.o scope.o pp_ctl.o pp_sys.o doop.o doio.o regexec.o utf8.o taint.o deb.o universal.o xsutils.o globals.o perlio.o perlapi.o numeric.o mathoms.o locale.o pp_pack.o pp_sort.o \
miniperlmain.o opmini.o perlmini.o -lsocket -lnsl -ldl -lm -lpthread -lc
Undefined first referenced
symbol in file
__dtrace_perl___sub__entry pp_hot.o
__dtraceenabled_perl___sub__return pp_hot.o
__dtraceenabled_perl___sub__entry pp_hot.o
__dtrace_perl___sub__return pp_hot.o
ld: fatal: symbol referencing errors. No output written to miniperl
*** Error code 1
make: Fatal error: Command failed for target `miniperl'

ということで、以下の手順でmakeします。


$ wget http://www.cpan.org/src/perl-5.10.1.tar.gz
$ gzip -cd perl-5.10.1.tar.gz | tar xf -
$ cd perl-5.10.1
$ chmod 755 Makefile.SH # 書き込み権限をつけてます。
$ vi Makefile.SH

○変更前


...
mini_obj = $(obj1) $(obj2) $(obj3) $(ARCHOBJS)
ndt_obj = $(obj0) $(obj1) $(obj2) $(obj3) $(ARCHOBJS)
obj = $(ndt_obj) $(DTRACE_O)
...
○変更後

...
mini_obj = $(obj1) $(obj2) $(obj3) $(ARCHOBJS) $(DTRACE_O)
ndt_obj = $(obj1) $(obj2) $(obj3) $(ARCHOBJS)
obj = $(obj0) $(ndt_obj) $(DTRACE_O)
...


以下は/usr/local以下にインストールする場合です。
ポイントは、"-Dusedtrace" になります。


$ ./Configure -des -Dcc=/usr/bin/cc -Dusethreads -Dprefix=/usr/local \
-Duse64bitint -Duseshrplib -Dusedtrace
$ make
/usr/sbin/dtrace -h -s perldtrace.d -o perldtrace.h
...
$ make test
...
t/x2p/s2p.....................................................ok
All tests successful.
u=2.21 s=1.45 cu=279.20 cs=22.38 scripts=1665 tests=234334
$ pfexec make install

こんな感じに perlプロバイダが見えるようになるので使えているはずです。


$ perl -e 'sleep 60' &
[4] 22551
$ pfexec dtrace -l |grep -i perl
65296 perl22511 libperl.so Perl_pp_sort sub-entry
65297 perl22511 libperl.so Perl_pp_dbstate sub-entry
65298 perl22511 libperl.so Perl_pp_entersub sub-entry
65299 perl22511 libperl.so Perl_pp_last sub-return
65300 perl22511 libperl.so Perl_pp_return sub-return
65301 perl22511 libperl.so Perl_dounwind sub-return
65302 perl22511 libperl.so Perl_pp_leavesublv sub-return
65303 perl22511 libperl.so Perl_pp_leavesub sub-return
65346 perl22551 libperl.so Perl_pp_sort sub-entry
65347 perl22551 libperl.so Perl_pp_dbstate sub-entry
65348 perl22551 libperl.so Perl_pp_entersub sub-entry
65349 perl22551 libperl.so Perl_pp_last sub-return
65350 perl22551 libperl.so Perl_pp_return sub-return
65351 perl22551 libperl.so Perl_dounwind sub-return
65352 perl22551 libperl.so Perl_pp_leavesublv sub-return
65353 perl22551 libperl.so Perl_pp_leavesub sub-return
$