MacOSX 10.5 には、Sun Solaris 由来の dtrace が入っていますね。
日常的に使うのは、strace くらいがちょうど良くて、使い方がちょっ
と面倒なんだけれど。dtruss というユーザ・インタフェースも入っ
ていますが、rootでないと使えないとか、コマンドは絶対パスでな
いと失敗するとか、オプションがちょっと使いにくいとかで今一つ
のできです。truss -o なら、ファイルに保存できるのに、
dtruss -o なら別の意味になってしまって。
dtrace で、namei という項目があるのに気が付きました。
------------------------------------------------------------
# dtrace -l | egrep namei
12951 fbt mach_kernel namei entry
12952 fbt mach_kernel namei return
12953 fbt mach_kernel nameidone entry
12954 fbt mach_kernel nameidone return
13460 fbt mach_kernel nfsm_chain_get_path_namei entry
13461 fbt mach_kernel nfsm_chain_get_path_namei return
13531 fbt mach_kernel nfsrv_namei entry
13532 fbt mach_kernel nfsrv_namei return
#
------------------------------------------------------------
namei を見ると、名前解決関連が全部網羅できそうで良さそうなの
ですが、今1つ使い方がわかりません。Sun のマニュアル「DTrace
ユーザーガイド」なども見てみたのですが、パッとしない説明が1
行ある程度でよくわかりません。
dtrace で namei() を調べる方法について、うまく行った人はいま
せんか。
open() とか stat() くらないならこんな感じでできます。
------------------------------------------------------------
# dtrace -n 'syscall::open:entry, syscall::stat:entry, syscall::stat64:entry { printf("%s",stringof(copyinstr(arg0))); }' -o /tmp/cat.dtrace -c "/bin/cat /etc/passwd"
...
# cat /tmp/cat.dtrace
CPU ID FUNCTION:NAME
1 17720 open:entry /etc/passwd
#
------------------------------------------------------------
システムコールをいちいちリストアップすると、疲れるので、
namei() だけにしたいというわけです。
\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報 \\
> 新城@筑波大学情報です。こんにちは。
> dtrace で namei() を調べる方法について、うまく行った人はいま
> せんか。
DTrace は、半年以上前にあまりよくわかっていないで使っていたので、
かなり忘却してますし、
しかも、namei って関数は Solaris にないし...
># dtrace -l | egrep namei
>12951 fbt mach_kernel namei entry
>12952 fbt mach_kernel namei return
左から、ターゲットの ID, PROVIDER, MODULE, FUNCTION, NAME を表していて、
それぞれ、dtrace の -i, -P, -m, -f, -n オプションで指定できます:
# dtrace -li 12951
# dtrace -lP fbt | grep namei
# dtrace -lm mach_kernel | grep namei
# dtrace -lf namei
# dtrace -ln fbt::namei:entry
また、-v でターゲットの詳細をレポートしてくれます。
# dtrace -lvn fbt::namei:entry
を実行すれば、たぶん、
Argument Types
args[0]: struct nameidata *
というのがレポートされると思います。
これは、DTrace スクリプト内で、
fbt::namei:entry
/pid == $target/
{
p = (struct nameidata *)arg0;
printf("%p", p->ni_dirp);
}
のように使用できます。
# dtrace -n 'fb::namei:entry /pid == $target/ {...}' -c "..."
とか、上記スクリプトをファイル(foo)に書いて、
# dtrace -s foo -c "..."
とかすれば、良いのじゃないかなぁ :-)
In article <h566le$ti$1...@aioe.org>
tesi...@diary.ocn.ne.jp (tesi...@diary.ocn.ne.jp) writes:
> fbt::namei:entry
> /pid == $target/
> {
> p = (struct nameidata *)arg0;
> printf("%p", p->ni_dirp);
> }
> のように使用できます。
> # dtrace -s foo -c "..."
ありがとうございます。次のスクリプトで、だいたい思った通りの
動きになりました。
------------------------------------------------------------
% cat dtrace-namei.d
fbt::namei:entry
/pid == $target/
{
p = (struct nameidata *)arg0;
printf("%s", copyinstr(p->ni_dirp));
}
% dtrace -s dtrace-namei.d -c "/bin/ls /"
dtrace: script 'dtrace-namei.d' matched 1 probe
<lsの表示>
dtrace: pid 65668 has exited
CPU ID FUNCTION:NAME
1 12951 namei:entry /
1 12951 namei:entry .
1 12951 namei:entry /
%
------------------------------------------------------------
これは、いいですね。nameidata は、次の所に定義がありました。
FreeBSD とも同じなのでしょう。
http://opensource.apple.com/source/xnu/xnu-1228.9.59.color/bsd/sys/namei.h
http://opensource.apple.com/source/xnu/xnu-1228.9.59.color/bsd/vfs/vfs_lookup.c
dtrace で動的リンク・ライブラリ等も表示されるのかと思ったの
ですが、出てきません。MacOSX/Darwin で Mach-O executable を
読込むにしても、namei() は呼ばれるだろうに。どうしてかなあ。
------------------------------------------------------------
% file /bin/ls
/bin/ls: Mach-O universal binary with 2 architectures
/bin/ls (for architecture i386): Mach-O executable i386
/bin/ls (for architecture ppc7400): Mach-O executable ppc
% otool -L /bin/ls
/bin/ls:
/usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0)
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.3)
%
------------------------------------------------------------
In article <h566le$ti$1...@aioe.org>
tesi...@diary.ocn.ne.jp (tesi...@diary.ocn.ne.jp) writes:
> また、-v でターゲットの詳細をレポートしてくれます。
> # dtrace -lvn fbt::namei:entry
dtrace -v でも、残念ながら MacOSX ではそんなに詳しくは出てき
ませんでした。
------------------------------------------------------------
% dtrace -lvn fbt::namei:entry
ID PROVIDER MODULE FUNCTION NAME
12951 fbt mach_kernel namei entry
Probe Description Attributes
Identifier Names: Private
Data Semantics: Private
Dependency Class: Unknown
Argument Attributes
Identifier Names: Private
Data Semantics: Private
Dependency Class: ISA
Argument Types
None
%
------------------------------------------------------------
private と言われてもね。これは、ソース見るしかなさそう。
In article <h566le$ti$1...@aioe.org>
tesi...@diary.ocn.ne.jp (tesi...@diary.ocn.ne.jp) writes:
> しかも、namei って関数は Solaris にないし...
Solaris のマニュアルには、一応あるけれど、関数という訳ではな
いですね。「sysinfo プロバイダのプローブ」と書いてあります。
http://docs.sun.com/app/docs/doc/819-6259/gbxwz?a=view
In article <3993872...@rananim.ie.u-ryukyu.ac.jp>
ko...@ie.u-ryukyu.ac.jp (Shinji KONO) writes:
> > dtrace で動的リンク・ライブラリ等も表示されるのかと思ったの
> > ですが、出てきません。MacOSX/Darwin で Mach-O executable を
> > 読込むにしても、namei() は呼ばれるだろうに。どうしてかなあ。
> Prebinidng されるからじゃなかったかな。
> ls /var/db/dyld
> あたり? 10.4 / 10.5 あたりで変わったし、あまり知らないんですが。
Prebinidng について調べて見ました。今回はあまり関係なさそう。
dtrace で調べていた ls ですか、次のようにして otool で調べて
も PREBOUND が出てきません。
------------------------------------------------------------
% otool -h -v /bin/ls
/bin/ls:
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
MH_MAGIC I386 ALL 0x00 EXECUTE 14 1304 NOUNDEFS DYLDLINK TWOLEVEL
%
------------------------------------------------------------
10.3 だと、PREBOUND 出ますね。
------------------------------------------------------------
% otool -h -v /bin/ls
/bin/ls:
Mach header
magic cputype cpusubtype filetype ncmds sizeofcmds flags
MH_MAGIC PPC ALL EXECUTE 15 1912 NOUNDEFS DYLDLINK PREBOUND TWOLEVEL
%
------------------------------------------------------------
Prebind に関して参考にしたページはこれです。
http://developer.apple.com/documentation/performance/Conceptual/LaunchTime/Articles/Prebinding.html
dtruss だと /lib のファイルは stat だけして終りですね。open
も何もしてない。dtruss では表示されないシステムコールを
使っているのかもしれません。
------------------------------------------------------------
% dtruss /bin/ls /|& egrep /
stat("/usr/lib/dtrace/libdtrace_dyld.dylib\0", 0xBFFFD028, 0xBFFFDEBC) = 0 0
open("/usr/lib/dtrace/libdtrace_dyld.dylib\0", 0x0, 0x0) = 3 0
stat("/usr/lib/libncurses.5.4.dylib\0", 0xBFFFCE18, 0xFFFFFFFFBFFFB694) = 0 0
stat("/usr/lib/libgcc_s.1.dylib\0", 0xBFFFCE18, 0xFFFFFFFFBFFFB694) = 0 0
stat("/usr/lib/libSystem.B.dylib\0", 0xBFFFCE18, 0xFFFFFFFFBFFFB694) = 0 0
stat("/usr/lib/system/libmathCommon.A.dylib\0", 0xBFFFCB68, 0xFFFFFFFFBFFFB694) = 0 0
open("/dev/dtracehelper\0", 0x2, 0xBFFFDE44) = 3 0
open_nocancel("/dev/urandom\0", 0x0, 0x0) = 3 0
stat64("/\0", 0xBFFFED64, 0x3) = 0 0
open_nocancel("/\0", 0x100004, 0x0) = 4 0
%
------------------------------------------------------------
それにしても、stat でも namei() には掛かって欲しいのだけれど、
出てこないのは問題だなあ。もっと上の層でキャッシュにかかって
いるのかな。
>新城@筑波大学情報です。こんにちは。
>dtrace で動的リンク・ライブラリ等も表示されるのかと思ったの
>ですが、出てきません。MacOSX/Darwin で Mach-O executable を
>読込むにしても、namei() は呼ばれるだろうに。どうしてかなあ。
"/pid == $target/" を取ると良いかもしれないです。
そうなると、本当に -c で指定したプロセスの結果なのか、
わからなくなりますが...
>> しかも、namei って関数は Solaris にないし...
>
>Solaris のマニュアルには、一応あるけれど、関数という訳ではな
>いですね。「sysinfo プロバイダのプローブ」と書いてあります。
>
>http://docs.sun.com/app/docs/doc/819-6259/gbxwz?a=view
これ:
# dtrace -ln namei
ID PROVIDER MODULE FUNCTION NAME
2604 sysinfo genunix lookuppnvp namei
のようですが、Solaris のソースを見たら、本当にプローブにしか
ならないようです。
統計情報を得るのに使うとか、
名前検索をするのは lookuppnvp という関数だということがわかる、
ぐらいしか使い方は思い浮かばないです。
In article <h5ba53$k7p$1...@aioe.org>
tesi...@diary.ocn.ne.jp (tesi...@diary.ocn.ne.jp) writes:
> "/pid == $target/" を取ると良いかもしれないです。
> そうなると、本当に -c で指定したプロセスの結果なのか、
> わからなくなりますが...
情報ありがとうございます。試してみました。/bin/ls については、
"/pid == $target/" の有無で結果は変りませんでした。
> >http://docs.sun.com/app/docs/doc/819-6259/gbxwz?a=view
> # dtrace -ln namei
> ID PROVIDER MODULE FUNCTION NAME
> 2604 sysinfo genunix lookuppnvp namei
> のようですが、Solaris のソースを見たら、本当にプローブにしか
> ならないようです。
性能のチューニングに使いたくなる人もいるのかもしれない、とい
うことでしょうか。