Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Sun DTrace namei()

21 views
Skip to first unread message

Yasushi Shinjo

unread,
Aug 2, 2009, 11:02:23 PM8/2/09
to
新城@筑波大学情報です。こんにちは。

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() だけにしたいというわけです。

\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報       \\

tesi...@diary.ocn.ne.jp

unread,
Aug 3, 2009, 4:21:00 AM8/3/09
to
y...@is.tsukuba.ac.jp (Yasushi Shinjo) writes:

> 新城@筑波大学情報です。こんにちは。

> 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 "..."

とかすれば、良いのじゃないかなぁ :-)

Yasushi Shinjo

unread,
Aug 4, 2009, 1:57:00 AM8/4/09
to
新城@筑波大学情報です。こんにちは。

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

Yasushi Shinjo

unread,
Aug 5, 2009, 1:10:06 AM8/5/09
to
新城@筑波大学情報です。こんにちは。

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() には掛かって欲しいのだけれど、
出てこないのは問題だなあ。もっと上の層でキャッシュにかかって
いるのかな。

tesi...@diary.ocn.ne.jp

unread,
Aug 5, 2009, 2:51:12 AM8/5/09
to
y...@is.tsukuba.ac.jp (Yasushi Shinjo) writes:

>新城@筑波大学情報です。こんにちは。

>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 という関数だということがわかる、
ぐらいしか使い方は思い浮かばないです。

Yasushi Shinjo

unread,
Aug 5, 2009, 11:17:42 PM8/5/09
to
新城@筑波大学情報です。こんにちは。

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 のソースを見たら、本当にプローブにしか
> ならないようです。

性能のチューニングに使いたくなる人もいるのかもしれない、とい
うことでしょうか。

0 new messages