0

我是 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

需要配置一些吗?如何解决?

演示图像

4

2 回答 2

2

尝试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

奇怪的是,使用sudowhile already root 会导致 DTrace 探测器不触发。我猜 sudo 会干扰 DTrace 权限。这对我来说是新的(显然,我只dtrace从 Mac OS X 上的 root shell 运行开始)。我相信其他人可以更好地解释这一点。

于 2013-07-21T05:34:02.927 回答
1

已经迟到了,但是你可以做的而不是产生一个 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 从生成的进程中丢失文件描述符之外,我在这方面没有遇到任何问题。

于 2013-07-21T11:51:52.820 回答