在 Mac 中,执行 Dtrace,但控制台没有可显示的内容
Posted
技术标签:
【中文标题】在 Mac 中,执行 Dtrace,但控制台没有可显示的内容【英文标题】:In Mac ,exec Dtrace, but console has nothing to display 【发布时间】:2013-07-20 09:32:16 【问题描述】:我是 dtrace 的新手
当我执行代码时sudo dtrace -n 'syscall::read:entry /execname != "dtrace"/ @reads[execname, fds[arg0].fi_pathname] = count();
然后我在另一个控制台中执行 cat 文件名。
但控制台没有任何显示。
环境:OS x 10.8.4 dtrace:Sun D 1.6.2 需要配置一些吗? 如何解决?
【问题讨论】:
【参考方案1】:尝试sudo bash
启动root shell,然后不使用sudo 直接运行dtrace。
这是一个值得思考的例子:
root@macbook:~> sudo dtrace -n 'syscall::read:entry /execname != "dtrace"/ @reads[execname, fds[arg0].fi_pathname] = count(); '
dtrace: description 'syscall::read:entry ' matched 1 probe
^C
root@macbook:~> dtrace -n 'syscall::read:entry /execname != "dtrace"/ @reads[execname, fds[arg0].fi_pathname] = count(); '
dtrace: description 'syscall::read:entry ' matched 1 probe
^C
bash ??/<unknown (NULL v_name)>/ttys022 1
fseventsd <unknown (not a vnode)> 1
mds <unknown (not a vnode)> 1
Terminal <unknown (not a vnode)> 2
firefox <unknown (not a vnode)> 2
activitymonitor <unknown (not a vnode)> 3
Terminal ??/<unknown (NULL v_name)>/ptmx 5
Activity Monito <unknown (not a vnode)> 8
Google Chrome H <unknown (not a vnode)> 13
Google Chrome <unknown (not a vnode)> 15
Google Chrome ??/<unknown (NULL v_name)>/urandom 72
奇怪的是,使用 sudo
而已经是 root 会导致 DTrace 探测器无法触发。我猜 sudo 会干扰 DTrace 权限。这对我来说是新的(显然,我只从 Mac OS X 上的 root shell 运行dtrace
开始)。我相信其他人可以更好地解释这一点。
【讨论】:
【参考方案2】:已经迟到了,但是你可以做的就是这样而不是产生一个 root shell。
由于在 Ctrl-c-ing sudo 时会丢失输出缓冲区(因此是输出),因此您可以重写脚本以使用 profile
提供程序转储结果。
配置文件提供程序提供与基于时间的中断相关联的探针,该中断触发每个固定的指定时间间隔。
dtrace -s /dev/stdin
syscall::read:entry /execname != "dtrace"/
@reads[execname, fds[arg0].fi_pathname] = count();
profile:::tick-2sec
printa(@read);
trunc(@read);
Ctr-d
我同意 Brendan 的回答,但我总是尽量避免使用持久的 root shell,因为我是一个相当草率和健忘的家伙,迟早我会使用那个 root shell,即一个坏主意。
我希望 MacOS X 开发人员能尽快解决这个 sudo 问题。
此外,我想说的是,尽管有几个人声称,sudo 确实会干扰 dtrace 行为?除了使用 ctrl-c 生成的进程丢失文件描述符之外,我在这方面什么都没遇到。
【讨论】:
以上是关于在 Mac 中,执行 Dtrace,但控制台没有可显示的内容的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在 Mac OS X 上通知 DTrace 动态生成的代码?
如何在 Mac OS X Leopard 上的 dtrace 中使用热点探针?
无法在 Mac OS X 上通过 jinfo 启用 DTrace 探测