差分表示


*DTrace
ここはマニュアル抜粋のメモ。あとで使うなとおもった内容を一式抜粋してます。
ページ数がある場合は、日本語マニュアルのページ数になってます。

**samples
文法とかはマニュアル読めって感じで、例によって自分で使ったのを載せる方向で。

***プロセスのuserland symbol trace
以下のコマンドが基本型。ユーザシンボルのtraceであり、対象execnameに含まれるシンボルだけが
trace出力の対象になる。このため、runtime libraryの呼び出し等も含めたい場合、probeの
probemodule(左から2項目)の指定を適切に変える必要がある。(-qを指定すると出力がぐちゃぐちゃに
なるので注意。)
--(
dtrace -c "<execname> <args>" -F -n 'pid$target:<execname>::entry,
  pid$target:''<execname>''::return'
--)

user symbolの関数の場合でも :::enterのarg[0-9]はその関数の引数になっているので、内容のdumpが可能である。

***子プロセスのexec/waitpidモニタ
procプロバイダでfork1付近をモニタしてみた。第1引数で対象とするexecnameを指定すると、
それがfork/execする子プロセスの生成付近をみて、終了時にsi_codeを拾ってログ出力する。~
で、びみょぃのが、procプロバイダのexec/exec-xxx probeのマニュアル上の説明では
exec probeはfork前のstate、exec-xxx probeではfork後のstateを持つと書いてあるのだが、
実際に書いて調べてみる限りではexec probeが呼ばれた時点で子プロセスのstateになっていた。
---(
#!/usr/sbin/dtrace -qs
/*
probe           args[0]         args[1]         args[2]
create          psinfo_t *
exec            char *
exec-failure    int
exit            int
fault           int             siginfo_t *
start
*/

dtrace:::BEGIN
{
        ename = $$1;
        printf("target execname : %s\n", ename);
}

this watchid;
this chldname;
proc:::exec
/ execname == ename /
{
        watchid = curpsinfo->pr_ppid;
        chldname = args[0];
}

proc:::exec-success
/ ppid == watchid /
{
        flag[watchid] = 1;
}

proc:::exec-failure
/ ppid == watchid /
{
        flag[watchid] = 0;
}

proc:::exit
/ ppid == watchid && flag[watchid] == 1 /
{
        printf("[invoked by %d] %s si_code is %d\n",
                ppid, chldname, args[0]);
}
---)
proc:::exitのhookは未完成。

ホントはwaitpid()とかで拾える子プロセスの戻り値を拾いたいのだが、
syscall::wait:がwaitid(2)とかwaitpid(3C)あたりなのかよくわからん。

それでも上記のサンプルを載せたのはproc providerの説明と実際が一致してなかったからだったりする。

***syscall monitor
他に方法もあるだろうが、引数に対応するsyscall::[func]:entryをmonitorするスクリプト。
引数を取って使うと言う部分のために載せてみた。
---(
#!/usr/sbin/dtrace -qs

self string t;

dtrace:::BEGIN 
{
        t = $$1;
        printf("target : %s\n",t);
}

syscall:::entry
/ probefunc == t /
{
        printf("[%d]%s %s\n",pid, execname, t);
        printf("--------------\n");
}
---)

***file io monitor
アプリケーションの動作を調べる上で、特定ファイルに対するI/Oが発生した際の ustackが
見たかったので書いてみた。対象とするファイルをコマンドライン引数で指定する。
io providerのargs[0]からioを、args[2]からファイルの情報を拾っている。~
なお、args[2]->fi_nameはパス名ではなく、ディレクトリエントリ上に登録されている
ファイル名になるので、パス名だとmatchしないので注意。
---(
io:::start
/ args[2]->fi_name == $1 /
{
        printf("[%d]%s %s %s\n", pid, execname,
                args[0]->b_flags & B_READ ? "read" : "write",
                args[2]->fi_pathname);
        ustack();
        printf("--------------\n");
}
---)
i/o providerの場合、ファイルをwriteするときはmonitorするのにreadするときは
monitorできないのはなんでだろか。。。

***syscall::open monitor
こりゃ DTraceぃぃゎーと思ったきっかけになったのが下記。
これだとマニュアルに載ってる気がするが、記念品ってことでw

open(2)の第1引数がさすパス名文字列を、直だと当然ただの
アドレスなので、copyinstr()で参照先をstringにして dumpしてる。
---(
syscall::open:entry
{
        printf("[%d]%s open %s\n",
        pid, execname, copyinstr(arg0));
        ustack();
        printf("--------------\n");
}
---)

**dtrace(1M)コマンドライン引数
知りたいものだけを適当にメモ
,opt,desc
,-P provier -m module -f function -n name,provider:module:function:name
,,表示フィルタは -n ::hoge:hoge みたいに評価させてfilterするのがぃぃ
,-n '1 liner',
,-F,pragma D option flowindent
,-c <cmd args>,exec cmd under dtrace

**DTraceマクロ変数一覧(p.183)
抜粋の表のままです。
,name,desc
,$[0-9],マクロ引数
,$target,ターゲットプロセスID。-cで実行したときの実行されたコマンドのPID
,$egid,実効グループID
,$euid,実効ユーザID
,$gid,実グループID
,$pid,プロセスID(dtrace自身のpid)
,$uid,ユーザID
,$pgid,プロセスグループID
,$ppid,親プロセスID
,$sid,セッションID
,$taskid,タスクID

**DTrace組込み変数一覧(p.67-)
抜粋の表とは順番を適当に変えてます。
,name,desc
,int64_t arg0 ・・ arg9,probeに渡される最初の10個の引数の64bit int表現。10より足りない部分は0になる。
,args[],probeに渡された型付き引数。arg[0-9]と一緒だが、probeの引数に合わせた型になる。これはprobe毎に何があるか異なるので、個々にマニュアルを見るべし。
,uint64_t timestamp,DTraceの処理時間もカウントしたnsのcounter
,uint64_t vtimestamp,DTaceの処理時間をカウントしないnsのcounter
,uint64_t walltimestamp,UNIX時間なtick timer
,string probename,dtrace -lの末尾。probeの名前
,string probefunc,dtrace -lの後から2個目。probeの関数部
,string probemod,drace -lの3項目。probeのmodule部
,string cwd,thrのCWD
,pid_t pid,自身のPID
,pid_t ppid,親プロセスのPID
,int errno,errno
,string root,ルートディレクトリ。chrootしてなきゃ /
,uint_t stackdepth,stackframeの深さ
,id_t tid,thrのID
,uint64_t uregs[],なんかわからん。chap33参照
,gid_t gid,gid
,uint_t uid,effective uid
,uint_t epid,probeが呼ばれたときのeffective pid
,uintptr_t caller,名前の通り、PCの参照先
,chipid_t chip,CPUチップ識別子
,processorid_t cpu,CPU識別子
,cpuinfo_t *curcpu,CPU情報
,lwpsinfo_t *curlwpsinfo,thrにbindしているLWPの状態。proc(4)を参照
,psinfo_t *curpsinfo,thrに関連づけられたプロセスの状態。proc(4)を参照
,kthread_t *curthread,thr/LWPにbindされたkthrのアドレス。
,uint_t id,probeのid
,uint_t ipl,割り込みレベル
,lgrp_id_t lgrp,応答時間グループのグループID
,psetid_t pset,現在のCPUが含まれるpsrsetのID

**関連情報
***DTT
OpenSolaris.orgのsub projectに[[DTrace Toolkit>http://www.opensolaris.org/os/community/dtrace/dtracetoolkit/]]てのがある。
Solaris10の場合、/usr/demo/dtrace配下に、DTraceのマニュアルにあるスクリプトが一式入っているが、
マニュアルにあるものなので、実戦投入wはなかなかである。

install用のscriptが同梱されている tar.gzが提供されていて、/opt/DTT配下に展開される。
2007-11-29現在で ver0.9.9である。
結構な数のD scriptがあるので、Solarisバンドル以外のサンプルとして見てみる価値があるし、
実際の調査でそのまま使える気がする。

公式にもリンクのある[[このサイト>http://www.nbl.fi/~nbl97/solaris/dtrace/index.html]]で、
DTTも含めたDTraceの紹介プレゼン(%%odpのみで翻訳版もある。出来ればpdfも置いてほしいが・・・%%  %%翻訳されたのとおもいきや、リンク先のファイルは爽やかにファイル名だけが異なるoriginal版の模様です%%  と思いきや、Day2だけを翻訳したそうです)がある。
紹介プレゼンは3部構成(DTrace紹介、DTT紹介、実際の例)になっているので、
他の人に紹介する際の資料のベースとしてこのプレゼンはなかなか使える。

***misc
雑多なリンク

-ja
--http://nippondanji.blogspot.com/2007/07/dtrace.html
--[[docs.sun.com/trussのman>http://docs.sun.com/app/docs/doc/819-1210/truss-1?a=view]]
-en
--http://www.opensolaris.org/os/community/dtrace/

--http://blogs.sun.com/tpenta/entry/dtrace_using_placing_sdt_probes
--http://blogs.sun.com/alanbur/entry/dtrace_and_perl
--http://www.solarisinternals.com/wiki/index.php/DTrace_Topics_Overhead
--http://www.sun.com/bigadmin/content/dtrace/
--http://wikis.sun.com/display/DTrace/Documentation

*** Perl5.10.1 /w DTrace
-[[DTrace support in 5.10.1>http://search.cpan.org/~dapm/perl-5.10.1/INSTALL#DTrace_support]]
- [[Dtrace and Perl on Alan Burlison's Blog>http://blogs.sun.com/alanbur/entry/dtrace_and_perl]]
-- 最低限、-Duseshrplib -Dusedtraceの指定は必須。SunStudio1xではなく、 /usr/sfw/bin/gccで buildしましょう。
-- [[Makefile.SH修正のticket>http://rt.perl.org/rt3//Public/Bug/Display.html?id=73630]] / [[patch用のdiff>http://mage.oops.jp/images/Makefile.SH.diff]] / [[あててbuildしたpkg>http://mage.oops.jp/images/Perl5101d.pkg]](SPARC/Solaris用pkg。多分 10限定。ご利用は計画的にw )
- [[Patch for 5.8.8>http://rich.phekda.org/perl-dtrace/perl-5.8.8-dtrace-20070720.patch]]


Last-modified: 2010-04-24 19:16:29